C++的=运算符重载并非简单内存拷贝

原创 2008年10月30日 20:10:00
    当我们定义一个C++类,如果没有为其定义=运算符重载,那么编译器就为其定义默认的=运算符重载。即默认拷贝。前阵子一个朋友问我:默认的=运算符重载是否就是直接的内存拷贝?
   由于自己功底有限,没有考虑过这个问题,所以不敢立刻回答。虽然我们常说浅复制和深复制,但我确实没有想过默认拷贝函数是否只是简单的拷贝内存内容。
   当然,事实胜于雄辩,编个代码试试就说明了问题。其实C++的默认=运算符重载是“逐个调用成员变量的=运算符重载”。而不该理解为简单的内存拷贝。
   以下代码试图说明这个问题:

  1. #include <iostream>
  2. using namespace std;

  3. class B
  4. {
  5. public :
  6.     // 为B写个=运算符重载函数
  7.     B& operator=( const B& )
  8.     {
  9.         cout << "Call B operator=" << endl;
  10.     }
  11. };
  12. // 定义类A,但不为其编写=运算符重载
  13. class A
  14. {
  15. public :
  16.     B b;
  17. };

  18. int main()
  19. {
  20.     A a1;
  21.     A a2;
  22.     a1 = a2; // 将a2复制给a1,观察输出,证明调用了类B的=运算符重载
  23.     getchar();
  24.     return 0;
  25. }


    屏幕输出了 Call B operator= ,说明了这并不是简单的内存拷贝。
    虽然这些都是很细节的问题,不过还是提醒自己要多多积累,毕竟这样的细节在工作中可能引起不容易察觉的bug。

c++简单几种运算符重载

简单介绍几种运算符重载c++的类中有最基本的“六大少”: 构造函数,拷贝构造函数,赋值语句,析构函数,取地址运算符重载和const修饰的取地址运算符重载,接下来进行简要的说明(我们以Test类为主)...
  • angry_youth
  • angry_youth
  • 2017年03月20日 18:55
  • 956

C++中深浅拷贝问题以及重载=运算符

在C++中用一个对象去初始另一个对象时会调用拷贝构造函数。 在拷贝时候,会分为深浅拷贝,今天我就这两个问题来写一点我自己的理解。 创建一个类,并用类的对象去初始化另一个类。 代码如...
  • sum_TW
  • sum_TW
  • 2016年10月10日 23:26
  • 1787

关于c++的运算符重载那些事

搞c++有一段时间了,今天突然要重载一个运算符,发现自己有点忘了,遂查查资料做一下c++运算符重载的小总结。 一、何为运算符重载 运算符的重载是c++语言特有的,java什么的是没有运算符重载的,所以...
  • uestclr
  • uestclr
  • 2016年04月16日 21:59
  • 3259

C++_运算符重载_前缀自增与后缀自增

由于前缀自增与后缀自增在如果通过运算符重载在形式上相同,都为 以Date类为例 Date& operator++(Date &)(全局函数)/ Date& operator++( )(成员函数)无法区...
  • u010003835
  • u010003835
  • 2015年08月06日 18:16
  • 2759

【C++面向对象】C++中运算符重载的两种方式

我们知道在C++中可以通过重载运算符的方式,使类实现类似于基本类型的运算符操作,如+、-、*、/等等。本文介绍这种重载运算符的两种方法。 我们先自定义一个类,来作为本次研究的对象: class I...
  • lzhui1987
  • lzhui1987
  • 2016年10月28日 11:21
  • 3379

C++基础篇--运算符重载

运算符重载没有多高深复杂,但牵扯到的相关概念和语法变化不少,如果这块基石不牢固,读复杂C++代码时就只有雾里看花的份。 运算符重载由来     C/C++中所有运算符(+-*/等)默认只用于基本数据类...
  • ipmux
  • ipmux
  • 2015年09月01日 15:04
  • 977

C++回顾之前置++、后置++、不等号!及赋值运算符重载

关于前置++,后置++,非(不等号)运算符及赋值运算符的重载
  • ab198604
  • ab198604
  • 2014年02月24日 16:44
  • 8698

C++实践参考——分数类中的运算符重载

【项目1-分数类中的运算符重载】   (1)实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、比较(6种关系)的运算。class CFraction { private: ...
  • sxhelijian
  • sxhelijian
  • 2016年05月19日 21:44
  • 3252

【C++】强制类型转换运算符的重载

#include #include using namespace std; class MyCin {     bool bStop;     public:         My...
  • u012261044
  • u012261044
  • 2014年06月07日 10:28
  • 1015

C++--模板遇上运算符重载

#include using namespace std; template class Complex { friend Complex MySub(Complex& c1,Complex&...
  • sum_TW
  • sum_TW
  • 2016年12月26日 16:58
  • 2057
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++的=运算符重载并非简单内存拷贝
举报原因:
原因补充:

(最多只允许输入30个字)