本文主要是介绍学构造函数的这辈子有了,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
拷贝构造函数
1.拷贝构造函数,是一个特殊的构造函数。系统默认提供了。但是可以手动定义。
2.功能:使用一个类对象给另一个类对象初始化时,会自动调用拷贝构造函数
3.定义格式
1、没有返回值
2、函数名与类同名
3、参数:该类的其他对象的引用
4、访问权限:一般为public
5、定义格式:类名 (类名 &other)
调用时机:
使用一个类对象给另一个初始化时:
string s1("hello world"); //调用有参构造
string s2 = s1; //调用拷贝构造
string s3(s1); //调用拷贝构造
使用值传递时实参取代形参时调用拷贝构造函数。
使用值返回时返回结果也是调用拷贝构造。
深浅拷贝问题:
如果类中有指针成员并且指向其它空间时,应调用深拷贝
使用浅拷贝就会出现多个对象中指针成员指向同一个内存空间,析构指针空间时,会造成对同一块内存空间的多次释放的情况,造成段错误(double free),此时就需要深拷贝。
深拷贝需要程序手动定义拷贝构造函数,在拷贝构造函数的初始化列表中,给新对象的指针成员重新分配空间,将原来对象指针空间指向的内容拷贝到该空间中即可完成深拷贝
Stu(Stu &other):name(other.name),age(other.age),score(other.score),ptr(new int(*other.ptr)){cout<<"Stu::深拷贝构造函数"<<endl;}
移动构造函数
如果类中不显性定义拷贝构造函数或者移动构造函数,那么系统会自动提供这两个函数,如果程序员手动定义了其中任意一个函数,系统就两个都不提供了,如果需要使用,则需要程序员自己手动定义
移动构造函数,是将临时空间或将亡空间,托管给一个新的对象。
1、没有返回值
2、函数名与类同名
3、参数:该类的其他对象的右值引用
4、访问权限:一般为public
5、定义格式:类名 (类名 &&other)
//自定义移动构造函数Stu(Stu &&other):name(other.name),age(other.age),score(other.score),ptr(new int(*other.ptr)){cout<<"Stu::移动构造函数"<<endl;}//调用移动构造函数Stu s3 = move(s1);
取地址运算符重载函数
功能:取得当前类对象的地址
定义格式
1、返回值:当前类的指针
2、参数:无
3、权限:一般为public
4、格式: 类名 * operator&()
//自定义取地址运算符重载函数Stu * operator&(){cout<<"取地址运算符重载函数"<<endl;return this;}//取地址运算符重载函数&s1;
一个空类中默认提供的特殊成员函数
class Temp
{public:Temp(){} //无参构造Temp(const Temp &other){} //拷贝构造~Temp(){} //析构函数Temp * operator&(){return this;} //取地址运算符重载函数Temp(const Temp &&other){} //移动构造Temp &operator=(const Temp& other){} //拷贝赋值函数Temp &operator=(const Temp&& other){} //移动赋值函
};
这篇关于学构造函数的这辈子有了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!