目录
- class Date
- {
- public:
- Date(int year, int month, int day)
- {
- _year = year;
- _month = month;
- _day = day;
- }
- private:
- int _year;
- int _month;
- int _day;
- };
对于构造函数,如上代码,在创建对象时,调用构造函数后,类成员会有一个初始值,但这样并不是初始化,初始化只能有一次,而在函数里可以有多次赋值。
使用初始化列表才是对类成员的初始化:
在函数定义后面加”:“,有多个值用逗号隔开
- class A
- {
- public:
- A(int a = 10, int b = 20)
- :_a(a)
- ,_b(b)
- {
-
- }
- private:
- int _a;
- int _b;
- };
此外,C++11中对于缺省参数的补丁其实本质也是初始化列表
- class A
- {
- public:
-
- private:
- int _a = 10;
- int _b = 20;
- };
注意:
1、初始化列表中的成员变量只能初始化一次
2、引用成员变量、const成员变量、没有默认构造函数的自定义类
初始化列表的成员变量初始化顺序是根据声明顺序,而不是给值的顺序
防止隐式类型转化
构造函数不仅可以用于初始化的作用,还可以用于隐式类型转换。
- class A
- {
- public:
- A(int a = 10)
- :_a(a)
- {
-
- }
- private:
- int _a = 10;
- int _b = 20;
- };
-
- int main()
- {
- A a1(100);
- A a2 = 200; //发生类型转换,先生成tmp临时变量,在将tmp拷贝给a2
-
- return 0;
- }
在构造函数前面加一个explicit关键字就可以制止类型转换
![]()

在类中的成员变量是所有这个类共享的,且只能在类外定义和初始化。

静态成员函数没有this指针,所以无法访问普通成员变量,但可以访问静态成员变量。
访问静态成员时,可以类名::静态成员
友元是一种突破class类封装的一种语法
friend关键字
友元顾名思义就是这个类的朋友。类外部的函数是不能访问类的私有成员的,使用友元就可以使其能够访问类的私有成员
语法:在类中用friend关键字声明外部的函数、类等
友元函数
在类中声明外部定义的函数,外部的函数就可以访问类中的私有成员
- class A
- {
- friend void Print(A& a1); //声明是A类的友元函数
- public:
- A(int a = 0)
- :_a(a)
- {
-
- }
- private:
- int _a;
- };
-
- void Print(A& a1)
- {
- cout << a1._a;
- }
-
- int main()
- {
- A a1(10);
-
- Print(a1);
-
- return 0;
- }
友元类
在类中声明外部定义的类,外部定义的类就可以访问这个类中的私有成员了
注意:B是A的友元类,但A并不是B的友元类
- class A
- {
- friend class B; //声明B是A的友元类
- public:
- A(int a = 0)
- :_a(a)
- {
-
- }
- private:
- int _a;
- };
-
- class B
- {
- public:
- B(int b = 0)
- :_b(b)
- {
-
- }
-
- void Print(A& a1)
- {
- cout << a1._a;
- }
- private:
- int _b;
- };
-
-
- int main()
- {
- A a1(10);
- B b1;
-
- b1.Print(a1);
-
- return 0;
- }
内部类
在类中定义类,比如在A类中定义B类,B类就是A的友元类,但A不是B的友元类
内部类
- class A
- {
- public:
- A(int a = 0)
- :_a(a)
- {
-
- }
- private:
- int _a;
-
- public:
- class B
- {
- public:
- B(int b = 0)
- :_b(b)
- {
-
- }
-
- void Print(A& a1)
- {
- cout << a1._a;
- }
- private:
- int _b;
- };
- };
-
- int main()
- {
- A a1(10);
- A::B b1;
-
- b1.Print(a1);
-
- return 0;
- }