C++复制构造函数与重载赋值操作符

内容整理自:

C++拷贝构造函数(深拷贝,浅拷贝)

C++中复制构造函数与重载赋值操作符总结

深拷贝和浅拷贝的区别 

对深拷贝与浅拷贝的再次理解

禁止使用类的copy构造函数和赋值操作符

拷贝构造函数中的陷阱

函数原型

在C++中建立一个类,这个类中肯定会包括构造函数、析构函数、复制构造函数和重载赋值操作。

复制构造函数是一种特殊的构造函数,其作用也是为类的成员初始化以及为对象的构造分配存储空间。函数的名称必须和类名称一致,无返回类型,它的唯一的一个参数是本类型的一个引用变量,该参数是const类型,不可变。

复制构造函数原型如下:

class_name(const class_name &src);

对于一个类X, 如果一个构造函数的第一个参数是下列之一:a) & X; b) const & X; c) volatile & X; d) const volatile & X;
且没有其他参数或其他参数都有默认值,那么这个函数是拷贝构造函数,如下:
X::X(const & X);   
X::X(& X, int=1); 
X::X(& X, int a=1, int b=2); 

重载赋值操作符是一个特别的赋值运算符,通常是用来把已存在的对象赋值给其它相同类型的对象。

重载赋值操作符的原型如下:

class_name& operator=(const class_name &src);


复制构造函数与重载赋值操作符的调用

当类的对象需要拷贝时,复制构造函数将会被调用。以下情况都会调用复制构造函数:
一个对象以值传递的方式传入函数体;
一个对象以值传递的方式从函数返回;
一个对象需要通过另外一个对象进行初始化。

如果对象在声明的同时将另一个已存在的对象赋给它,就会调用复制构造函数;如果对象已经存在了,然后再将另一个已存在的对象赋给它,调用的就是重载赋值运算符。

#include 
using namespace std;

class CTest
{
public:
     CTest(){}
     ~CTest(){}

     CTest(const CTest &test)
     {
          cout<<"copy constructor."<#include 
using namespace std;
class CA
{
 public:
  CA(int b,char* cstr)
  {
   a=b;
   str=new char[b];
   strcpy(str,cstr);
  }
  CA(const CA& C)
  {
   a=C.a;
   str=new char[a]; //深拷贝
   if(str!=0)
    strcpy(str,C.str);
  }
  void Show()
  {
   cout<


三法则(英语:rule of three,the Law of The Big Three,The Big Three;三法则,三大定律)在 C++ 程序设计里,它是一个以设计的基本原则而制定的定律,三法则的要求在于,假如类型有明显地定义下列其中一个成员函数,那么程序员必须连其他二个成员函数也一同编写至类型内,亦即下列三个成员函数缺一不可:

  • 析构函数(Destructor)
  • 复制构造函数(copy constructor)
  • 复制赋值运算符(copy assignment operator)


有时候为了防止默认拷贝发生,可以将复制构造函数和重载赋值运算符设为private来禁止拷贝,并且只是声明,不用实现。这样的话,如果试图调用 A  b(a); 就调用了私有的复制构造函数,编译器会报错。

class Widget  
{  
public:  
    int* pi;  
private:  
    Widget(const Widget&);  
    Widget& operator=(const Widget&);  
}; 

这种方法的一点小缺陷是,如果该类的成员函数或其友元函数调用复制构造函数或赋值操作符函数,会将错误推后到连接期。有一种方法可以将连接期错误移至编译期:先定义一个基类,然后让你的类继承该类。

你可能感兴趣的:(C++)