1

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
}
4

2 回答 2

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

请注意,在许多情况下,副本已被优化掉。请参阅复制省略。此外,在 C++11 中,在许多过去调用复制构造函数的地方都调用了移动构造函数。但是移动构造函数也可以在可能发生复制省略的相同位置进行优化。

我想不出很多你会使用“构造函数”的原因,正如你所说的那样。

附带说明一下,复制构造函数应该几乎总是有这个签名:

MyClass(MyClass const &)

不是这个:

MyClass(MyClass &)
于 2013-09-12T02:53:55.403 回答
0

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

于 2013-09-12T03:04:57.690 回答