编写像这样的构造函数是否正确?
class A
{
A(const A& a)
{
....
}
};
如果是,那么调用它是否正确:
A* other;
...
A* instance = new A(*(other));
如果没有,你有什么建议?
由于
答案 0 :(得分:4)
几乎正确。在类中声明构造函数时,只需编写A
,而不是A::A
;在类声明之外给出构造函数的定义时,你会使用A::A
。否则,是的。
另外,正如James指出的那样,除非您从通过指针访问的对象进行复制,否则不需要进行任何解除引用(如果它是值或引用)。一个人通常不使用指针,除非有必要这样做。根据这个原则,你会有类似的东西:
A x; // Invoke default constructor
// ...
// do some thing that modify x's state
// ...
A cpy(x); // Invokes copy constructor
// cpy now is a copy of x.
但请注意,第一个语句A x
调用默认构造函数。 C ++将提供该构造函数的默认实现,但它可能不是您想要的,即使它是您想要的,更好的风格,恕我直言,明确地给一个让其他程序员知道您已经考虑过它
修改的
C ++将自动提供默认构造函数的实现,但前提是您不提供任何用户定义的构造函数 - 一旦您提供了自己的构造函数,编译器将不会自动生成默认构造函数。说实话,我忘记了这一点,因为我一直习惯于自己给出所有构造函数定义,即使它们不是绝对必要的。在C ++ 0x中,可以使用= default
,这将提供使用编译器生成的构造函数的简单性,同时使其有意将其用于其他开发人员。
答案 1 :(得分:0)
不,你正在写一个拷贝构造函数。它不会按预期行事(根据提供的示例)。
class A{
A(arguments){ ...}
}
我建议阅读一本C ++书籍,很好地解释了构造函数和复制构造函数之间的差异。
何时使用?复制实例时。例如,通过按值返回/传递实例
void foo (A a){
//copy constructor will be called to create a
}
A bar(){
return a; //Copy constructor will be called
}