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。

1、C++关于拷贝构造函数和赋值运算符重载问题的测试程序。因为调用顺序不清,导致内存泄漏new delete

#include #include using namespace std; class ClsComplex { private: int m_nReal; int m_nIma...

C++中关于拷贝构造函数和重载赋值运算符的一些体会

一、编译器自动调用拷贝构造函数的情况 1.当用一个已经存在的对象初始化被定义的新对象时。 2.如果函数的参数为类的对象,而参数的传递方式为传值传递,当发生函数调用时,相当于用实参对象初始化正在创建...
  • wnc2011
  • wnc2011
  • 2013年05月07日 18:57
  • 509

C++中的构造函数,拷贝构造函数,析构函数和赋值运算符重载

1.构造函数 类的数据成员不能在声明类时初始化,为了解决这个问题,C++提供了构造函数(constructor)来处理对象的初始化。 **构造函数特点:** 1->函数名和类名相同。 ...
  • tzy5210
  • tzy5210
  • 2016年11月09日 16:39
  • 199

[C++]拷贝构造函数和赋值运算符重载

原文作者:冯明德;补充说明:Shosh 重点:包含动态分配成员的类 应提供拷贝构造函数,并重载"="赋值操作符。 以下讨论中将用到的例子: class CExample { pu...

C++ 构造函数 析构函数 拷贝构造函数 运算符重载解析。

C++ 构造函数, 析构函数, 构造函数重载, 重载运算符

C++ 运算符重载和拷贝构造

为了直观上观察到拷贝构造函数的调用,结合运算符重载来分析,有一下代码:// 运算符重载.cpp : 定义控制台应用程序的入口点。 //#include "stdafx.h" #include usi...

C++之派生类的拷贝构造与赋值运算符重载

这里只说一下为什么派生类在拷贝构造器和赋值运算符重载中一些注意语法: 一、派生类的拷贝构造器1.派生类的拷贝构造器跟普通构造器一样,若没有自定义生成,编译器会自动生成拷贝构造器,自动调用父类的拷贝构...

c++构造函数、拷贝构造函数、析构函数、赋值运算符重载

构造函数 构造函数的特点: 1.是一个特殊的成员函数; 2.名字与类名相同; 3.有初始化列表; 4.创建类类型对象时,由编译器自动调用,在对象的声明周期内只调用一次; 5.构造函数可以重载,实参决定...

C++的缺省的拷贝构造函数和赋值运算符重载函数

C++的缺省的拷贝构造函数和赋值运算符重载函数
  • wu4long
  • wu4long
  • 2014年02月13日 18:23
  • 1050

C++ 拷贝构造函数(即复制构造函数)和赋值运算符重载(有说赋值构造函数)区别

如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。 倘若类中含有指针变量,那么这两个缺省的函数就隐含了错误。以类String 的两个对象a,b 为例,假设a.m_da...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++的=运算符重载并非简单内存拷贝
举报原因:
原因补充:

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