作用: C++在定义类的变量的时候,首先调用构造函数并且在类的变量被释放前调用析构函数。一般来讲,构造函数可以为类内成员变量来初始化,也可以对类内其他类的成员进行初始化。析构函数一般可以进行释放调用的资源。
构造函数:
在C++的类中,构造函数的名字与类的名字相同。构造函数的参数可以由这个类的变量来进行传递。构造函数还可以进行参数重载、参数默认
//class defination class stu{ public: stu(int a,int b); stu(int c); private: int age,score,gpa; } stu::stu(int a,int b){ age = a; score = b; } stu::stu(int c){ gpa = c; } //main stu a(1,3);//a.age=1,a.score=3 stu b(1);//a.gpa=1 stu c//❌
默认构造函数:
上面代码最后一行错了的原因是,c++默认如果class中没有创建构造函数,则自动帮助创建构造函数(stu::stu(){})可是这个构造函数中没有参数也没有什么作用。如果我们一旦自己创建了构造函数,那么默认的构造函数就不会帮我们创建,因此上述代码中我们没有为变量中不需要传值的情况考虑,因此最后一行会报错,解决办法其一是新增一个构造函数(无参数值)其二是对构造函数设置默认参数。
析构函数:
析构函数的名字是在构造函数名字前加上‘~’,并且如果存在多个类,那么析构函数在多个类结束生命周期前,按照构造函数执行顺序的逆序来执行(有点像栈)。
组合类(包容类)
组合类可以看做类的一种嵌套,在一个a类中定义b、c类的变量
class Book{ int a; } class Name{ int b; } class c{//组合类 Book a; Name b; }
其中c为组合类
组合类中的执行顺序:
组合类中优先定义内部子类的变量,然后才是自己的构造函数。
//class defination class stu{ public: stu(){ cout << "构造(stu)" << endl; } ~stu(){ cout << "析构(stu)" << endl; } }; class tea{ public: tea(){ cout << "构造(tea)" << endl; } ~tea(){ cout << "析构(tea)" << endl; } }; class tor{ public: tor(){ cout << "构造(tor)" << endl; } ~tor(){ cout << "析构(tor)" << endl; } private: stu a; tea b; }; //main int main(){ tor a; return 0; } //output 构造(stu) 构造(tea) 构造(tor) 析构(tor) 析构(tea) 析构(stu)
显然,在创建tor类变量后执行顺序为内部类构造函数(stu->tea)->自身类构造函数(tor)
组合类中的初始化
class stu{ public: stu(int a=0){ age = a; cout << "stu中age为:" << age << endl; } void operator=(int a){ this->age = a; } private: int age; }; class tor{ public: tor(int for_tor,int for_stu):a(for_stu){/******/ score = for_tor; cout << "tea中score为:" << score << endl; } private: stu a; int score; }; int main(){ tor a(1,2); return 0; }
为了在tor中使用stu的构造函数对a进行赋值,需要在tor的构造函数后,使用冒号:引出a的构造函数的参数列表,然后进行参数的赋值。
对于想要赋值多个构造函数的参数的情况,可以使用逗号来分隔。