一篇文章让你看懂C++构造函数 析构函数
作用:初始化对象的数据成员
特征
以类名作函数名,无返回类型。
种类
- 无参数构造函数:
A(void) {//无参数构造函数
m = 0.0;
n = 0.0;
std::cout << "调用无参数构造函数\n";
}
如果程序员没有写无参数构造函数,那么编译器会自动生成一个默认的无参数构造函数,此函数什么都不做。
- 一般构造函数:
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(){}//析构函数
也可以写成:
~A() = default;//析构函数
析构函数可以保证对象被销毁时,它申请的那块内存能够得到释放,以访造成内存泄漏。