发布时间:2024-02-28 19:01
目录
1. 初始化列表
样例:
那么初始化列表初始化和构造函数初始化有何区别呢?
初始化顺序
总结
2. explicit关键字
3. static成员
静态成员
静态成员函数
4. 友元
4.1 友元函数
特性
4.2 友元类
5. 内部类
以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个\"成员变量\"后面跟一个放在括号中的初始值或表达式。
样例:
class Day { public: Day(int year=2001,int month=4) :_year(year) , _month(month) {} private: int _year; int _month; };
功能:是对象成员进行定义的地方,对对象成员进行初始化。
构造函数也能完成对对象成员的定义,在定义对象的时候,对象成员就已经被定义好存在了,这是对整体的直接定义。
而里面的数据成员可以在定义时初始化,也可以定义时不初始化。
对于上述_year 和 _month 这两个成员来说,用构造函数和初始化列表来定义和初始化是没有什么区别的。
那么初始化列表初始化和构造函数初始化有何区别呢?
有些特殊类型的数据成员,他们只能在定义的时候初始化,(过了这个村就没有这个店了)
因为构造函数是整体定义的,当一个对象创建好后,里面的成员就已经被定义好了,若存在特殊类型的成员,没有在定义时初始化,就会报错。
在这里初始化列表的作用就显示出来了。
初始化列表是对象进行定义和初始化的地方:
除了上述的const修饰的成员变量和引用成员变量,还有一个没有默认构造的自定义类型成员,也需要使用初始化列表。
在没有用初始化列表初始化自定义类型时,会默认调用自定义类型的默认构造函数;
当使用初始化列表初始化没有默认构造函数的自定义类型时,会自动调用他的构造函数。
初始化顺序
成员变量在类中声明次序就是其在初始化列表中的初始化顺序,与其在初始化列表中的先后次序无关
class Day { public: Day(int year) :_bb(year) , _b(_bb) {} void Print() { cout << _b << \" \" << _bb << endl; } private: int _b; int _bb; }; int main() { Day d1(2001); d1.Print(); return 0; }
总结
成员变量在初始化列表中只能出现一次
引用成员变量、const成员变量、没有默认构造函数的自定义类型成员这三种必须在初始化列表中初始化。
初始化列表是成员定义的地方,对于对象来说,在定义时,都是默认先走一次初始化列表,如果初始化列表显示表达出来,就会对内置类型初始化,对自定义类型调用他的构造函数。
成员变量在类中声明次序就是其在初始化列表中的初始化顺序
构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用。
用explicit修饰构造函数,将会禁止单参构造函数的隐式转换。
静态的成员变量一定要在类外进行初始化
静态成员声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;
能像上面那样调用的前提是,静态成员为公有
如果静态数据成员为私有,如何整?
原方式无法访问:
这里可以在类中添加返回函数:
但是如果不用对象的话,如何用类调用此函数?
静态成员函数
用static修饰的成员函数,称之为静态成员函数。
友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字
特性
友元函数不能用const修饰
友元函数可以在类定义的任何地方声明,不受类访问限定符限制
一个函数可以是多个类的友元函数
友元函数可访问类的私有和保护成员,但不是类的成员函数
友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
当A类想访问B类中的私有成员时,可以将A类设置成B的的友元类。设置A为B的友元类:
如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类默认是外部类的友元类。
内部类可以通过外部类的对象参数来访问外部类中的所有成员,但外部类不是内部类的友元。但是内部类会受到访问限定符的限制: