如何编写构造函数

时间:2010-06-02 02:13:48

标签: c++ oop constructor reference pointers

编写像这样的构造函数是否正确?

class A
{
    A(const A& a)
    {
    ....
    }
};

如果是,那么调用它是否正确:

A* other;
...
A* instance = new A(*(other));

如果没有,你有什么建议?

由于

2 个答案:

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