详解:http://www.cnblogs.com/xkfz007/archive/2012/05/11/2496447.html
例子:
// Constructor.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class CTest
{
public:
/*explicit*/ CTest(int i = 0)
:m_i(i)
{
cout << "default constructor" << " m_i = " << m_i << endl;
}
CTest(const CTest &rhs)
{
this->m_i = rhs.m_i;
cout << "copy constructor" << " m_i = " << m_i << endl;
}
CTest &operator=(const CTest &rhs)
{
this->m_i = rhs.m_i;
cout << "assignment operator" << " m_i = " << m_i << endl;
return *this;
}
private:
int m_i;
};
int _tmain(int argc, _TCHAR* argv[])
{
cout << "====test0 默认构造函数====" << endl;
CTest test0;
cout << "==========================" << endl;
cout << "====test1 自定义构造函数====" << endl;
CTest test1(1);
cout << "==========================" << endl;
cout << "====test2 复制构造函数====" << endl;
CTest test2(test1);
cout << "==========================" << endl;
cout << "====test3 =复制构造函数====" << endl;
CTest test3 = test1;
cout << "==========================" << endl;
CTest test4;
cout << "====test4 赋值操作符====" << endl;
test4 = test1;
cout << "==========================" << endl;
cout << "====test5 隐式自定义操作符====" << endl;
CTest test5 = 5;
cout << "==========================" << endl;
CTest test6;
cout << "====test6 隐式自定义操作符====" << endl;
test6 = 6;
cout << "==========================" << endl;
getchar();
return 0;
}
运行结果:
需要注意的几点:
1、系统会自动实现默认构造函数,复制构造函数和赋值操作。
2、只要自己实现了一个构造函数(包括复制构造函数),系统不再自动生成默认构造函数;
3、自己实现了一个构造函数(没有实现复制构造函数),系统会自动生成复制构造函数;
4、CTest test3 = test1; 这种情况下调用的是复制构造函数,而不是赋值操作;
5、构造函数默认支持隐式转换,可以使用explicit来避免隐式转换;
6、深拷贝和浅拷贝,系统默认实现的是浅拷贝。