C++构造函数分类
代码解释:
#include <iostream>
using namespace std;
class Parent{
public:
/*默认构造函数*/
//Parent(){} //该构造函数不显示地写出来
/*普通无参构造函数*/
Parent(){cout<<"普通无参构造函数"<<endl;}
/*普通有参数构造函数*/
Parent(int value):_value(value){cout<<"普通有参构造函数1"<<endl;}
// Parent (int value = 0):_value(value){cout<<"普通无参构造函数2"<<endl;}// 不能与无参构造同时使用,二义性;所以为了避免与前面的普通无参构造函数冲突,此处注释掉了
/*拷贝构造函数*/
Parent(Parent& p){this->_value=p._value;cout<<"拷贝构造函数1"<<endl;}
//Parent(Parent& p,string s="hello word"){this->_value=p._value;<<s<<endl;cout<<"拷贝构造函数2"<<endl;} //与第一个拷贝构造函数有二义性,所以此处注释了
//Parent(const Parent& p){this->_value=p._value;cout<<"拷贝构造函数3"<<endl;} //与第一个拷贝构造函数有二义性,所以此处注释了
/*移动构造函数*/
//Parent(Parent&& p){str= nullptr;str = s.str;s.str = nullptr;cout<<"移动构造函数"<<endl;}//假设此类有一个char *str成员变量,并且p对象在内部new了空间给成员指针变量str
/*拷贝赋值函数*//*注意,拷贝赋值函数不是构造函数,只是普通的运算符重载函数*/
const Parent& operator=(const Parent &p)
{
if(&p==this)return *this;
/*假设此类有一个char *str成员变量,并且p对象的str指针成员变量指向一个字符串或字符数组:
delete []str;
str=nullptr;
str=new char[strlen(p.str)+1];
strcpy(this->str,p.str);
*/
this->_value=p._value;
cout<<"拷贝赋值函数"<<endl;
return *this;
}
~Parent(){
/*假设此类有一个char *str成员变量,并且p对象的str指针成员变量指向一个字符串或字符数组:
if(str==nullptr)return;
delete []str;
*/
cout<<"析构函数"<<endl;
}
protected:
int _value;
};
int main()
{
/*默认构造函数的调用方式*/
Parent p;
/*普通无参构造函数的调用方式*/
Parent p1();
/*普通有参构造函数的调用方式*/
Parent p2(2);
/*拷贝构造函数的调用方式*/
//方式1
Parent p3=p2;
//方式2
Parent p4(p3);
/*移动构造函数的调用方式*/
//...
/*拷贝赋值函数的调用方式*/
p4=p3;//需要注意,赋值函数不是构造函数,不知道为什么很多文章都喜欢说“赋值构造函数”,但是重载了赋值运算符的函数绝不是构造函数,p4一定是已经存在的对象,而不是还未构造的对象。
return 0;
}
执行结果:
[Running] cd "/home/username/code/vscode/demo/constructor/" && g++ -std=c++11 construct_demo.cpp -o construct_demo && "/home/username/code/vscode/demo/constructor/"construct_demo
普通无参构造函数
普通有参构造函数1
拷贝构造函数1
拷贝构造函数1
拷贝赋值函数
析构函数
析构函数
析构函数
析构函数
[Done] exited with code=0 in 0.238 seconds
注意:拷贝赋值函数不是构造函数

浙公网安备 33010602011771号