class Integer {
public:
int val;
Integer() { // 默认构造函数
std::cout << "Integer()" << std::endl;
}
Integer(const Integer& v) { // 拷贝构造函数,注意右值一定为该类的引用!!!
std::cout << "Integer(const Integer& v)" << std::endl;
}
Integer& operator = (const Integer& v) { // 赋值操作函数,注意右值一定为该类的引用!!!
std::cout << "Integer& operator = (const Integer& v)" << std::endl;
return *this;
}
Integer(int v): val(v) { // 自定义构造函数,用于带参构造
std::cout << "Integer(int v)" << std::endl;
}
operator int() const { // 类型转换运算符
std::cout << "operator int() const" << std::endl;
return val;
}
};
int main()
{
Integer v1; // 调用默认构造函数 Integer()
v1 = 1; // 先调用 Integer(int v) 将 1 转换成 Integer, 再调用赋值操作函数 Integer& operator = (const Integer& v) 进行赋值
Integer v2 = 1; // 调用构造函数 Integer(int v), 等价于 Integer v2 = { 1 };
int v3 = v2; // 先调用 operator int() const 隐式地将 v2 转换 int 类型,再赋值
v1 = v2; // 调用 Integer& operator = (const Integer& v) 赋值操作函数
Integer v4 = v1; // 调用拷贝构造函数 Integer(const Integer& v)
Integer v5(v1); // 用拷贝构造函数 Integer(const Integer& v)
// 结果输出依次为:
// Integer()
// Integer(int v)
// Integer& operator = (const Integer& v)
// Integer(int v)
// operator int() const
// Integer& operator = (const Integer& v)
// Integer(const Integer& v)
// Integer(const Integer& v)
return 0;
}
调用拷贝构造函数与赋值操作函数的区别在于是否在声明的时候就进行初始化:
Integer v2; // 声明并未初始化
Integer v1;
v2 = v1; // 调用赋值操作函数
Integer v1;
Integer v2 = v1; // 声明并初始化,调用拷贝构造函数