目录
一、初始化列表
二、static成员
三、友元
初始化列表写在构造函数参数下面,用冒号开始,逗号分隔,每一个成员属性后用括号内的参数进行初始化。
class Date { public: Date(int year, int month, int day) : _year(year) , _month(month) , _day(day) {} private: int _year; int _month; int _day; };
为什么使用初始化列表,是因为成员属性一个初始化的时机。如果是普通的int类型等不需要初始化的属性,可不用初始化列表。但若是const类型的属性需要在定义的时候就初始化好,这时我们就一定要使用初始化列表来初始化这类属性,包含引用成员变量 、const成员变量 、自定义类型成员(该类没有默认构造函数)。
class A { public: A(int a)//没有默认构造函数 :_a(a) {} private: int _a; }; class B { public: B(int a, int b) :_a(a) ,_b(b) ,_c(1) {} private: A a; // 没有默认构造函数 int& b; // 引用 const int c; // const };成员变量的初始化顺序与初始化列表写的顺序无关,与成员变量定义的顺序有关。上述B类中的初始化顺序就是a->b->c。
在类中的属性前加static就是静态属性,在函数前加static就是静态成员函数。
在类中设置静态变量_scount,该变量生命周期不会随着一个对象结束而结束,任意一个该类的对象都会操作该属性。而静态函数GetACount,任意不同的对象调用该函数都是一样的,也可以直接使用A::来调用函数。个人理解,静态的成员因为其生命周期在一个类中,相当于该类的不同对象共同使用。初始化要在类外。
class A { public: A() {++_scount;} A(const A& t) {++_scount;} static int GetACount() { return _scount;} private: static int _scount; }; int A::_count = 0; void TestA() { cout<<A::GetACount()<<endl; A a1, a2; A a3(a1); cout<<A::GetACount()<<endl; }
c++11中支持非静态成员变量在声明时进行初始化赋值,但要注意这里不是初始化,而是为定义初始时提供一个缺省值。如果构造函数初始化列表中没有初始化,那么就会用这个默认值进行初始化。
class A { public: private: // 非静态成员变量,可以在成员声明时给缺省值。 int a = 10; static int n; }; int A::n = 10;
由于c++中的封装特性,一个类的私有属性是其他函数或者类不能直接访问的。如果一定要访
问,可以将这些类或函数定义为友元函数或友元类。
class B {}; class A { friend void f(); friend class B; private: int _a; }; void f() { cout<< _a << endl; }
将B类和f()函数定义为A的友元类后,B和f()就可以访问A的私有属性。但需要注意的是,友元类只是一个单向的关系,A并不能访问B的私有属性。
友元函数f()不能用const修饰。