【C++】——类的对象(下)
文章目录
- 再探构造函数
- Static成员
- 友元
- 内部类
- 匿名对象
再探构造函数
初始化列表
以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括 号中的初始值或表达式。
class Date { public: Date(int year, int month, int day) : _year(year) , _month(month) ,_day(day) //, _year(1)只能初始化一次 {} private: int _year; int _month; int _day; };
每个成员变量在初始化列表中只能出现一次,语法理解上初始化列表可以认为是每个成员变量定义初始化的地方。
我们需要注意,引用和const成员必须在初始化列表初始化
class Date { public: Date(int& ra,int year, int month, int day) : _year(year) , _month(month) , _day(day) //, _year(1)只能初始化一次 , _x(1) , _a(ra) {} private: int _year; int _month; int _day; const int _x; int& _a; };
没有默认构造的类类型变量,必须放在初始化列表位置进行初始化,否则会编译报错。
class sg { public: /*sg(int mn = 0) : _mn(mn) {}*/ private: int _mn; }; class Date { public: Date(int& ra,int year, int month, int day) : _year(year) , _month(month) , _day(day) //, _year(1)只能初始化一次 , _x(1) , _a(ra) , _mn(1) {} private: int _year; int _month; int _day; const int _x; int& _a; sg _mn; };
private: //声明处定义等同于缺省值 int _year = 1; int _month = 1; int _day = 1;
总结:以后尽量用初始化列表初始化。
因为那些你不在初始化列表初始化的成员也会走初始化列表,如果这个成员在声明位置给了缺省值,初始化列表会用这个缺省值初始化。如果你没有给缺省值,对于没有显示在初始化列表初始化的内置类型成员是否初始化取决于编译器,C++并没有规定。对于没有显示在初始化列表初始化的自定义类型成员会调用这个成员类型的默认构造函数,如果没有默认构造会编译错误。
初始化列表中按照成员变量在类中声明顺序进行初始化,跟成员在初始化列表出现的的先后顺序无关。建议声明顺序和初始化列表顺序保持一致。
class A { public: A(int a) : _a1(a) , _a2(_a1) {} void Print() { cout A aa(1); aa.Print(); return 0; } static int Get_a() { //a++;---静态成员函数中可以访问其他的静态成员,但是不能访问非静态的,因为没有this指针。 } void func() { //非静态的成员函数,可以访问任意的静态成员变量和静态成员函数。 cout // 友元声明 friend class b; private: int _a1 = 1; int _a2 = 2; }; class b { public: void func1(const a& aa) { cout cout return 0; } public: A(int a = 0) :_a(a) { cout cout public: int Sum_Solution(int n) { //... return n; } }; int main() { A aa1; //有名对象 // 不能这么定义对象,因为编译器无法识别下面是一个函数声明,还是对象定义 //A aa2(); // 生命周期只在当前一行 A(); // 匿名对象 A(1); Solution st; cout
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。