🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 一.构造函数 ### 1.作用 + 指导编译器为对象分配空间 + 完成对象的初始化操作 ### 2.特点 + **无名函数** 因为类型名不能作为函数名。 + **不可指定返回类型** 不能指定任何返回类型,即使void也不行。 + **支持成员初始化列表** ### 3.调用时机 >[warning]当该函数无参时,定义的对象后面不能加 () 。否则编译器会把它理解为一个函数声明。 对象初始化时: + 对象的创建 + `new` 对象 ### 4.定义与声明 + **定义** 支持默认参数 + `类名(参数表) {}` + `类名(参数表) : 成员初始化列表 {}` + **声明** `类名(参数表);` ### 5.默认构造函数 编译器自动创建的空的公有内联构造函数。 >[warning]当类满足下列条件时,编译器 **不会** 自动创建默认构造函数: > >+ 有用户定义的构造函数(包括有参的构造函数,例如拷贝构造函数和转换构造函数) >[warning]当类满足下列条件时,编译器将默认构造函数定义为弃置的 `delete`(在C++11之前,这些情况下编译器不会自动创建默认构造函数) : >+ 非静态类类型数据成员或基类没有无参构造函数,或无参构造函数不能访问(例如将无参构造函数设置为私有)。 >+ 非静态类类型数据成员或基类没有析构函数,或析构函数不能访问(例如将析构函数设置为私有)。 ### 6.缺省(无参)构造函数 默认构造函数和用户自定义的无参构造函数。 >[warning] 若要创建无参对象,即使在类中已有有参构造函数的情况下,也要增加一个无参构造函数,否则编译出错。 ### 7.构造函数的访问权限 8. 若所有构造函数的访问类型为 `protected` ,则只有类内成员函数、派生类和友元可以创建该类的对象。 9. 若所有构造函数的访问类型为 `private` ,则只有类内成员函数和友元可以创建对象。 ## 二.构造函数的成员初始化器列表 + **语法** `成员名(变量名),...` + **时机** + **初始化器列表执行时机** 类中数据成员的初始化时。 + **函数体执行时机** 类中数据成员的初始化后。 + **注意** 常变量和基类的构造只能在成员初始化器列表中完成。 >[danger] 反斜杠后面不能添加任何字符,包括注释。 ```c++ //数组的简单封装 class Array { private: int* array; int length; public: Array(int* arr,int len) \ : array(arr),length(len) {} //成员初始化列表 Array() { array = NULL; length = 0; } }; ``` >[warning] 成员初始化的顺序依照类的声明顺序,而不是成员初始化列表 ```c++ //一对夫妻 #include <iostream> #include <string> using namespace std; class Man{ private: string name_; public: Man() { cout<<"初始化Man对象"<<endl; } Man(string name):name_(name) { cout<<"初始化名字为"<<name<<"的Man对象"<<endl; } }; class Woman{ private: string name_; public: Woman() { cout<<"初始化Woman对象"<<endl; } Woman(string name):name_(name) { cout<<"初始化名字为"<<name<<"的Woman对象"<<endl; } }; class Pair{ private: Man husband_; Woman wife_; public: Pair() { cout<<"初始化Pair对象"<<endl; } Pair(string husband,string wife) \ :wife_(wife),husband_(husband) { //初始化顺序与初始化列表无关 cout<<"初始化含参的Pair对象"<<endl; } }; int main() { Pair p("xfs","lhb"); cout<<"p已初始化完毕"<<endl; return 0; } ``` >[test] >初始化名字为xfs的Man对象 >初始化名字为lhb的Woman对象 >初始化含参的Pair对象 >p已初始化完毕