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
}
答案 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'。