作用:初始化对象的数据成员
以类名作函数名,无返回类型。
如果程序员没有写无参数构造函数,那么编译器会自动生成一个默认的无参数构造函数,此函数什么都不做。
一般构造函数: A(double _m, double _n) {//一般构造函数(重载构造函数) m = _m; n = _n; std::cout << "调用一般构造函数\n"; }基于函数重载原理(参数列表不同,函数名一样都是类名),一般构造函数可以有多个
拷贝构造函数:参数为类对象本身的引用,而且是用一个已存在的类对象拷贝给一个新的该类对象。
A(const A& c) {//拷贝构造函数 m = c.m; n = c.n; std::cout << "调用拷贝构造函数\n"; }程序员没有写该构造函数时,系统会创建一个默认的拷贝构造函数,但需要注意的是:类中有指针成员时,不建议使用默认的拷贝构造函数。
赋值构造函数: 类似于拷贝构造函数,区别在于赋值构造函数等号两边的类对象均已创建。 A& operator=(const A& q) {//赋值构造函数(等号运算符重载) //先检验等号右边的是否就是等号左边的对象的本身,若是,则直接返回 if (this == &q) { std::cout << "调用赋值构造函数\n"; return *this; } //将右边的成员赋值到左边的对象中 this->m = q.m; this->n= q.n; std::cout << "调用赋值构造函数\n"; return *this; } 类型转换构造函数:类型转换构造函数的本质就是一般构造函数:根据一个某一确定类型(double d)创建一个该类(A)对象.
A(double d) {//类型转换构造函数 m = d; n = 0.0; std::cout << "调用类型转换构造函数\n"; }对于单参数的构造函数,C++会默认定义一个隐式类型转换,自动将该参数类型的值转换为这个类型的值。 可以用explicit禁止隐含类型转换:在编写这个类时在该构造函数名前添加关键字explicit,禁止隐含调用这个构造函数,但还是可以显式调用。
explicit A(double d) {//类型转换构造函数 m = d; n = 0.0; std::cout << "调用类型转换构造函数\n"; }·委托构造函数:
其本质就是委托其他构造函数帮助自己完成一些任务。
委托构造函数和其他构造函数一样,只不过委托构造函数的参数列表只可以包含其他一个构造函数函数参数列表里不能其他成员变量的初始化委托构造函数的参数列表要与包含的构造函数匹配。 date(int x=2020,int y=01,int z=01):year(x),month(y),day(z){ } date (int *a):date(*a,*(a+1),*(a+2)){ }//委托构造函数小技巧: 要是想禁止某个构造函数,可以通过delete显式说明:
A(double) = delete;也可以写成:
~A() = default;//析构函数析构函数可以保证对象被销毁时,它申请的那块内存能够得到释放,以访造成内存泄漏。