复制构造函数VS构造函数,以类指针作为参数

时间:2013-09-12 02:42:16

标签: c++ constructor

Q1:“自定义类型指针构造函数”是否具有正式/官方名称?

Q2:为什么复制构造函数比“自类类型指针构造函数”更有名?

或者我们必须使用复制构造函数而不是“自类类型指针构造函数”的情况是什么?

class MyClass 
{
public:  
    int i;
    MyClass()
    {
        i = 20;
    }

    //Copy constructor
    MyClass(MyClass const & arg) 
    {
        i = arg.i;
    }

    //What kind of Constructor is this one? 
    MyClass(MyClass* pArg)
    {
        i = pArg->i;
    }
};

int main() {
    MyClass obj;
    MyClass* p = new MyClass();

    //call copy constructor
    MyClass newObj(obj);                //call copy constructor directly
    MyClass newObj2(*p);                //dereference pointer and then call copy constructor
    MyClass* pNew = new MyClass(*p);    //dereference pointer and then call copy constructor

    //Call THE constructor
    MyClass theObj(&obj);               //get the address, call THE constructor
    MyClass theObj2(p);                 //call pointer constructor directly
    MyClass* ptheNew = new MyClass(p);  //call pointer constructor directly
}

2 个答案:

答案 0 :(得分:4)

没有特别的名字,因为没有什么特别的。

复制构造函数“更有名”,因为它很特殊。它很特别,因为它是语言运作方式的基本组成部分。如果您没有声明复制构造函数,那么在大多数类中,将为您隐式定义一个。它涉及许多基本操作,例如:

void foo(MyClass obj) // the copy ctor is (potentially) called to create this parameter
{
    ...
}

MyClass bar() // the copy ctor is (potentially) called when this function returns, and when it result is used
{
    ...
}

MyClass a;
MyClass b(a); // This calls the copy constructor
MyClass c = b; // So does this

请注意,在许多情况下,副本已经过优化。见Copy Elision。此外,在C ++ 11中,move constructor在许多复制构造函数被调用的地方被调用。但移动构造函数也可以在复制省略的相同位置进行优化。

我无法想到你会使用“构造函数”的许多理由,正如你所说的那样。

在旁注中,复制构造函数应该几乎总是有这个签名:

MyClass(MyClass const &)

不是这一个:

MyClass(MyClass &)

答案 1 :(得分:0)

对于C ++中的对象,我们通常使用引用而不是指针。我们可以使用引用来获取对象的地址,而不是使用'。'要访问其方法或数据,它比' - >'更简单直接。 我认为没有必要使用'THE constructor'。