class A
{private:int value;
public:
A(int n){value=n;
}
A(int other){value=other.value;
}
void print(){cout<<value<<endl;
}
};
int tmain(int argc,TCHAR*argv[]){
A a=10;
A b=a;
b.print();
return 0;
}
A(int other){value=other.value;} 这是复制构造函数,但参数类型错误。正确的应该是A(const A& other){value=other.value;}
A(int other){value=other.value;}
这个函数实际上不是一个复制构造函数。它是一个接受 int
类型参数的普通构造函数。但是,它的实现是有问题的,因为 int
类型没有 value
成员。
A(const A& other){value=other.value;}
这才是真正的复制构造函数。让我们来看看它们的区别:
- 参数类型:
- 第一个函数接受一个
int
类型的参数。 - 第二个函数接受一个
const A&
类型的参数,即 A 类的常量引用。
- 第一个函数接受一个
- 功能:
- 第一个函数试图从一个整数创建一个新的 A 对象,但实现是错误的。
- 第二个函数正确地从一个已存在的 A 对象创建一个新的 A 对象。
- 使用场景:
- 第一个函数会在尝试用一个整数初始化 A 类对象时被调用,例如
A a = 5;
- 第二个函数会在需要复制一个 A 类对象时被调用,例如
A b = a;
或者将 A 类对象作为参数传递给函数时。
- 第一个函数会在尝试用一个整数初始化 A 类对象时被调用,例如
- 正确性:
- 第一个函数的实现是错误的,因为
int
类型没有value
成员。 - 第二个函数正确地复制了其他 A 对象的
value
成员。
- 第一个函数的实现是错误的,因为
- const 关键字:
- 第二个函数使用
const
关键字,这意味着它不会修改被复制的对象,这是一个好的实践。
- 第二个函数使用
上面的代码
#include <iostream>
using namespace std;
class A
{
private:
int value;
public:
A(int n) { value = n; }
A(const A& other) { value = other.value; }
void print() { cout << value << endl; }
};
int main(int argc, char* argv[])
{
A a(10); // 使用圆括号而不是等号来调用构造函数
A b = a;
b.print();
return 0;
}