c++类和对象基础完结篇

    xiaoxiao2023-11-15  203

    再谈构造函数

    之前对构造函数简单的定义就是实现成员变量的初始化功能, 起始这并不准确: 在引入初始化列表之前, 我们只是对成员变量进行了声明和赋值而已, 并没有进行真正的初始化. 因为初始化只能进行一次, 而赋值可以进行多次.

    初始化列表:

    初始化列表做的事就是, 实现真正的成员变量的初始化: 初始化列表存在的意义: 初始化列表存在的意义就是有些地方必须要用初始化列表来解决. 引用成员变量: 引用的一大特点就是在声明的时候必须初始化, 必须要有指向的空间存在才行. 常量成员变量: 常量在定义之后就不能再次修改, 只能在声明时初始化一次, 之后就不能再赋值. 自定义成员变量: 自定义成员在声明后会调用该自定义类型的默认构造函数, 倘若没有默认构造函数, 就必须在初始化的时候将其构造函数的参数传进去. 成员变量经历的变化过程: 成员变量的声明 ---- 成员变量初始化(一次) ---- 成员变量的赋值(多次) 初始化列表初始化顺序: 按理说我们的预期应该是_a=100, _b=100. 这是因为初始化的顺序不由初始化列表的顺序决定, 而是由声明的顺序决定的. explicit关键字: 将常量赋值给自定义类型, 会出现一个神奇的效果: 100赋值给了该自定义类型的第一个声明的成员变量. 这是因为编译器在其中做了手脚, 其实本质上是经历了下面的过程: Tmp t_tmp(666) ---- t = t_tmp ---- 优化 可以在构造函数中加段代码来演示以下: 可以看出其实调用了两次构造函数. 还有一种情况: 就是直接 Tmp t = 666; 这个其实本质上经历了下面的过程: Tmp t_tmp(666) ---- Tmp t(t_tmp) ---- 优化 通过以上实例, 我们单个赋值, 只是赋值了第一个声明的成员变量_a, 其实c++11中可以 t = {666, 666} 这种花括号形式来赋值多个成员变量; 但是像这种代码的可读性是非常不好的, 为了避免这种情况的发生, 可以用 explicit 来修饰构造函数, 使得构造函数不支持单参构造函数的隐式转换.

    static成员:

    static的作用: 1.修饰局部变量: 改变生命周期 2.修饰函数, 全局变量: 改变连接属性 3.修饰成员函数, 无this变量, 属于类 4.修饰成员变量, 属于类

    static修饰类成员时, 被修饰的成员不属于某个实例, 而是属于这个类, 比如说计算一个类创建了多少个对象: 按理来说, t1(1)创建一个对象, t1=10这个过程产生了一个临时对象, 所以总共创建了2个对象, 但是: 调用了两次构造函数, 结果却显示创建了1个对象. 这是因为编译器优化的结果, 可以直观的认为是类型的隐式转换, 但是本质上还是需要创建一个临时对象. 所以说一个类到底创建了多少个对象, 还与编译器的优化有关. 这只是static一个简单的应用, static修饰的成员是属于类, 静态成员变量的定义在类外, 非私有的成员可以在类外通过类名直接访问. static计算1+2+…+n: 另外, 静态成员函数不能引用非静态成员函数和变量, 因为静态成员是属于类, 而普通成员是属于某个对象. 但是非静态成员函数可以调用静态成员函数和变量.

    C++11成员初始化:

    友元:

    友元函数: 在对 << 进行重载的时候, 因为函数参数列表中 this 指针抢占了第一个位置, 因此cout只能作为右操作数, 但这种使用方式不符合我们直观的使用方式, 此时我们必须将函数定义在外部并且能正常访问类的私有成员, 这就需要友元函数来实现: 注: 1.友元函数可以访问类的私有成员, 但它不是类的成员函数. 2.友元函数不能用 const 修饰. 3.友元函数可以在类的任何地方声明, 不受访问限定符的限制 4.一个函数可以是多个类的友元函数 5.友元函数声明在类内, 定义在类外. 友元类: 注: 1.友元类的所有函数都可以是另一个类的友元函数, 都可以访问另一个类的非共有成员. 2.友元关系是单向的, 友元类可以访问定义该友元类的类的私有成员, 但是内部定义友元类的类不能访问该友元类的私有成员. 3.友元不传递, A是B的友元, B是C的友元, 但A不一定是C的友元.

    内部类:

    在类中定义的类叫做该类的内部类. 内部类是外部类的友元类. B可以访问A的私有成员, 但是A不能访问B的私有成员. 内部类通过函数参数列表为外部类来访问外部类的私有成员. 内部类可以直接通过外部类类名直接访问外部类的静态成员.

    最新回复(0)