拷贝构造函数中是否可以调用重载后的赋值运算操作符
2006-12-04 22:11
267 查看
今天有朋友在成都程序员QQ群里提出一个的问题:在一个类的拷贝构造函数里,是否可以调用重载后的赋值运算操作符,以便用一套代码来方便地实现对类成员的赋值处理。
拷贝构造和赋值运算在语义上是完全不同的两件事,前者是“基于一个已存在的对象实例构造一个新的对象实例”,后者是“基于一个已存在的对象实例来更新另一个已存在的对象实例”。但是,除了语义上的不同,在语法上是否有问题呢?在逻辑上有没有问题呢?
语法肯定没有问题,上述代码可以顺利通过编译。
从逻辑上讲,似乎也看不出有什么问题。
进一步再想,在什么情况下必须自己来实现拷贝构造和赋值运算符呢?通常,是因为类成员中有指针,指向一些堆上的资源,不希望在复制和赋值的时候,出现两份指针指向同一份资源,比如:
上面的代码的确是啰嗦了,如果拷贝构造函数写成下面这样,明显要清爽一些:
除了代码啰嗦,似乎也找不出更多的理由来反对这种做法(在拷贝构造中调用重载后的赋值运算符),但是从情理上似乎说不通,但要证明这种做法的错误,就必须举出一个很明显的反例,该反例能说明在某种情况下,这样调用必然会出问题。
可惜,我还没有想出一个例子,能对这种违反语义、但不违反语法,同时能够达到目的的做法进行证伪。
Foo Foo sour sour Foo Foo rv
拷贝构造和赋值运算在语义上是完全不同的两件事,前者是“基于一个已存在的对象实例构造一个新的对象实例”,后者是“基于一个已存在的对象实例来更新另一个已存在的对象实例”。但是,除了语义上的不同,在语法上是否有问题呢?在逻辑上有没有问题呢?
语法肯定没有问题,上述代码可以顺利通过编译。
从逻辑上讲,似乎也看不出有什么问题。
进一步再想,在什么情况下必须自己来实现拷贝构造和赋值运算符呢?通常,是因为类成员中有指针,指向一些堆上的资源,不希望在复制和赋值的时候,出现两份指针指向同一份资源,比如:
Foo data_ Foo sour sour Foo Foo rv rv data_ data_ DATA_SIZE data_ rvdata_ DATA_SIZE data_
上面的代码的确是啰嗦了,如果拷贝构造函数写成下面这样,明显要清爽一些:
Foo sour DATA_SIZE data_ sourdata_ DATA_SIZE
除了代码啰嗦,似乎也找不出更多的理由来反对这种做法(在拷贝构造中调用重载后的赋值运算符),但是从情理上似乎说不通,但要证明这种做法的错误,就必须举出一个很明显的反例,该反例能说明在某种情况下,这样调用必然会出问题。
可惜,我还没有想出一个例子,能对这种违反语义、但不违反语法,同时能够达到目的的做法进行证伪。
相关文章推荐
- C++学习笔记-----在重载的赋值运算函数中调用拷贝构造函数
- C++ 拷贝构造函数和重载赋值操作符相互调用分析 [转]
- 深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结
- 对构造函数、拷贝构造函数和赋值操作符调用的简单回顾
- 深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结
- C++ 指针悬挂和赋值操作符的重载,拷贝构造函数实现
- 深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结
- 关于拷贝构造函数和重载赋值操作符
- C++拷贝构造函数的调用时机,如没有重载等号操作符,需重写使用深拷贝
- 构造函数,拷贝构造函数,赋值操作符的调用时机
- c++类的拷贝构造函数、隐式转换、重载的赋值操作符的一些分析和实例
- 想不到c++调用操作符运算居然也可以这样
- 我的学习笔记——c++拷贝构造函数,重载赋值操作符
- 重点:包含动态分配成员的类 应提供拷贝构造函数,并重载"="赋值操作符。
- 拷贝构造函数与重载赋值操作符的区别
- 对构造函数、拷贝构造函数和赋值操作符调用的简单回顾
- C++ 指针悬挂和赋值操作符的重载,拷贝构造函数实现
- 拷贝构造函数与重载赋值操作符
- 是否可以通过绝对内存地址进行参数赋值与函数调用---转载
- 面试题9:问题:是否可以从一个static方法内部发出对非static方法的调用?