c++特殊构造函数怎么用
这篇文章给大家分享的是有关c++特殊构造函数怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
拷贝构造函数
拷贝构造:是C++特有的,他是一种特殊的构造函数
用于基于一个同一个类的的第一个对象去创造和初始化的一个对象
第一的参数是本类的对象的引用(const)
一、什么是拷贝构造函数
一种特殊的构造函数,同一个类的一个对象去创造或初始化一个对象
在没写的时候,是默认存在的,自己写了之后,系统默认的就会消失(这一点,就是构造函数)
拷贝构造函数可以实现:对象的复制
class Monster{public: Monster(Monster& m)//拷贝构造函数(默认形态){//默认的拷贝构造函数(默认形态),将对象一一对应给值cout << "默认的拷贝构造函数(默认形态) " << endl;this->hp = m.hp;}Monster(int hp);//构造函数~Monster();//析构函数void show();private:int hp;};int main(){Monster monster1(100);monster1.show();Monster monster3 = monster1;//使用monster1给monster3初始化monster3.show();Monster monster4(monster1);//使用monster1去构造monster4monster4.show();return 0;}Monster::Monster(int hp){cout << "调用了带参构造函数" << endl;this->hp = hp;}Monster::~Monster(){cout << "调用了析构函数" << endl;}void Monster::show(){cout << "调用了显示函数" << endl;cout<<this->hp << "" << endl; }
二、调用时机
一、函数的参数是:“类的对象”
二、函数的返回值是类的对象
三、使用一的对象给另一个对象初始化
四、使用一个对象构造另一个对象
注意
赋值不属于拷贝构造,所以不调用拷贝构造函数
浅拷贝和深拷贝
浅拷贝就是默认的拷贝构造函数,这个拷贝构造的操作,我们可以理解为,是用‘=’号一个一个的赋值的,我们将之称为,浅拷贝,因为在用指针的时候就可以能会出现问,因为我们知道两个同等类型的指针之间用‘=’号赋值,是两个指针的地址指向同一个内存,那么就可能会存在一个问题,就是两个对象的指针都指向同一个内存,那么如果其中一个对象把该内存释放了,就会导致另外一个对象的指针变成野指针。
为此,我们就需要进行到深拷贝。
public:int *p;Rect();~Rect();int width;//宽int height;//高//重载拷贝构造,实现浅拷贝拷贝Rect(Rect&rect){this->height = rect.height;this->width = rect.width;this->p=rect.p;}
public:int *p;Rect();~Rect();int width;//宽int height;//高//重载拷贝构造,实现深拷贝Rect(Rect&rect){this->height = rect.height;this->width = rect.width;this->p = new int;//重新申请内存*p = *rect.p;//拷贝之前的值}
可见,浅拷贝与深拷贝的差距就是前者是直接拷贝指针,让两个指针同时指向一个地址,这样一方进行析构的时候,另一方就会成为野指针,而深拷贝就是避免了这一点,申请一块新内存,并复制这块内存的数据。
感谢各位的阅读!关于“c++特殊构造函数怎么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341