如何在c ++类中正确使用复制构造函数和赋值

时间:2013-02-20 06:43:01

标签: c++ copy-constructor assignment-operator

我为我的一个

指针数据成员编写了复制构造函数
class person
{
public:

 string name;
int number;
};



  class MyClass {
     int x;
    char c;
    std::string s;
    person student;
    MyClass::MyClass( const MyClass& other ) :
    x( other.x ), c( other.c ), s( other.s ),student(other.student){}
 };

但是当我运行此程序时出现以下错误

错误:成员'MyClass'[-fpermissive]的额外资格'MyClass ::' 我是否正确使用了复制构造函数。

3 个答案:

答案 0 :(得分:2)

MyClass::MyClass( const MyClass& other )
^^^^^^^^^^

只有在类定义之外定义主体时,才需要完全限定名称。它告诉编译器这个特定的函数(恰好是你的情况下的构造函数)属于名称限定类。
在类定义中定义主体时,暗示该函数是您定义它的类的成员,因此不需要完全限定名称。

答案 1 :(得分:0)

class person
{
public:

string name;
int number;
};

 class MyClass {
 int x;
 char c;
 std::string s;
 person *student;
 MyClass(const MyClass& other);
};

MyClass::MyClass( const MyClass& other ) :
 x( other.x ), c( other.c ), s( other.s ),student(other.student){
  x = other.x;
  c = other.c;
  s = other.s;
  student = other.student;
 }

现在编译好了。我仍然怀疑,我是否正确地进行了明确的复制构造函数和赋值操作。?

答案 2 :(得分:0)

如果您想要浅拷贝,(所有MyClass个实例都指向student的同一副本),请执行以下操作:

MyClass::MyClass( const MyClass& other ) :
    x( other.x ), c( other.c ), s( other.s ), student( other.student ) {}

否则,您需要深度复制,这是以这种方式实现的(注意取消引用):

MyClass::MyClass( const MyClass& other ) :
    x( other.x ), c( other.c ), s( other.s ) {
    student = new person(*(other.student)); // de-reference is required
}

运行以下代码以查看差异:

MyClass a;
person mike;
mike.name = "Mike Ross";
mike.number = 26;
a.student = &mike;
MyClass b(a);
b.student->number = 52;
cout << a.student->number << endl;
cout << b.student->number << endl;

浅拷贝输出:

52
52

深拷贝输出:

26
52