用户定义的复制构造函数

时间:2013-09-19 23:25:33

标签: c++

我收到以下代码的编译错误,但如果我删除了复制构造函数语句,则会编译相同的错误。

有人能让我知道这种行为吗?

class MyClass
{
    private:
        int i;
        MyClass(MyClass &);
    public:
        MyClass():i(0){}
};

int main(){
    MyClass obj = MyClass();
    return 0;
}

错误是:

MyClass.cpp: In function ‘int main()’: MyClass.cpp:15:24: error: no matching function for call to ‘MyClass::MyClass(MyClass)’ MyClass.cpp:15:24: note: candidates are: MyClass.cpp:11:2: note: MyClass::MyClass(MyClass&) MyClass.cpp:11:2: note: no known conversion for argument 1 from ‘MyClass’ to ‘MyClass&’ MyClass.cpp:10:2: note: MyClass::MyClass() MyClass.cpp:10:2: note: candidate expects 0 arguments, 1 provided 

2 个答案:

答案 0 :(得分:3)

这是因为您的复制构造函数是私有的,并且您没有实现它。你公开并实施它。你也忘记了const

class MyClass
{ 
private:
    int i;
public:
    MyClass():i(0){}
    MyClass(MyClass const & o){ i = o.i; }
};

int main(){
    MyClass obj = MyClass();
    return 0;
}

答案 1 :(得分:0)

当程序员希望让你知道未来程序员不打算复制这个对象时,会使用私有的未实现的复制构造函数。虽然更常见的是还包括私有部分中的复制构造函数,也没有像这样实现

private:
    obj(const obj& o);
    obj& operator=(const obj& o);
public:
    obj(...) 
    {
        ...
    }

如果由于使用的是具有私有拷贝构造函数的库类而出现错误,并且您正在尝试复制该对象,从而导致编译器错误

error C2248: 'obj::obj' : cannot access private member declared in class 'obj'
error C2248: 'obj::operator =' : cannot access private member declared in class 'obj'

然后您没有按预期使用该课程。

如果您自己创建一个对象并且确实希望将其复制,那么您需要实现一个公共构造函数,复制构造函数和赋值运算符,然后提供实现所有三个函数的代码。