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

拷贝构造函数示例如下

class Foo
{
public:
  Foo();
  Foo(const Foo &value);
  Foo &operator=(const Foo &value);
};

第5行就是一个拷贝构造函数(注意其参数可以不止一个Foo类的引用value,后面还可以跟带有默认值的参数,第一个参数一定是一个引用而不能是值,否则拷贝构造函数执行的时候会需要调用其本身来进行对象复制,最后形成无限递归),第6行是一个赋值运算符重载函数。
拷贝构造函数,顾名思义,就是在对象被复制的时候会调用的构造函数,而赋值运算符重载函数显然就是在赋值的时候会被调用的函数,看下面的代码

Foo f;
Foo v = f;

当定义一个f对象的时候,很显然,调用了构造函数Foo(),把f赋值给新的对象v的时候,会调用赋值运算符重载函数(也就是第6行),继续看下面的代码

Foo test_func()
{
  Foo f;
  return f;
}

当从函数中返回一个Foo对象时(注意是返回值,不是返回指针或者引用)就会调用拷贝构造函数了,因为对象需要从函数堆栈空间复制到调用它的代码所在内存空间里面去。
下面列出来的这些情况也会涉及到对象的复制,也就会有拷贝构造函数的调用
将Foo对象按值传递给函数做参数时;
异常处理中,将Foo对象抛出或者捕获时;
Foo对象初始化做为初始化参数传递时(例Foo s(f));