什么时候需要定义拷贝构造函数

来源:互联网 发布:游戏程序员面试 编辑:程序博客网 时间:2024/04/30 22:28

当没有定义拷贝构造函数时,对象值传递时是位拷贝,但是通常情况下,位拷贝已经能满足我们的要求,是我们不必自己定义拷贝构造函数。

但是什么时候需要自己定义呢?


这里有个简单的规则:如果你需要定义一个非空的析构函数,那么,通常情况下你也需要定义一个拷贝构造函数。

像我们常练习去写一个string类时,会去写个通构造,拷贝构造,重载赋值运算符=,因为里面有个指针变量char * pBuff,在析构函数中,一般都会将该指针置空,这样的析构就是个非空的析构函数。

 


如果你定义拷贝构造函数时遇到这样的错误:

 no copy constructor available or copy constructor is declared 'explicit'

意味着你的拷贝构造函数的参数不是const 。

而且拷贝构造函数是不能加explicit关键字的!
何谓拷贝?在这里,即类型相同的对象才能称为“拷贝”,既然类型相同,那就不存在什么隐式转换的问题!

只有构造函数的参数类型(单一参数或多参数带有默认值)与当前类类型不同时,才有隐式转换问题。 

explicit是用来防止外部非正规的拷贝构造的。要想不存在传值的隐式转换问题,就可以在变量前加上explicit 关键字。

0 0
原创粉丝点击