在C ++中调用复制构造函数

时间:2013-01-09 12:58:40

标签: c++ constructor copy-constructor

我有两个指向A类全局声明的指针

A* a;
A* b;

int main(){
     a = new A(...);           
}

我应该如何调用复制构造函数使b成为副本的BY OF VALUE。 A类没有任何指针作为字段。

我确实声明了一个构造函数,但我可以将其删除,以便不覆盖默认构造函数。

由于

3 个答案:

答案 0 :(得分:4)

您的代码有两个问题,需要在回答问题之前修复。

  1. 事实上,那些全球性的指针是全球性的 - 在全球命名空间中拥有全球性的东西,这是糟糕设计的标志(如果你的老师提倡它 - 因为它看起来有点像家庭作业 - 然后因为这样做而打了他的脸)
  2. 这些全局指针是原始指针的事实 - 你要么想要保留所有权而不是通过所有权 - 那么你将使用unique_ptr或只是普通对象(除非对象是应该活得比main()长,但这是一个奇怪的情况。)
  3. 因此,在更正代码后,它看起来像这样:

    int main()
    {
        A a;
        A b(a);      
    }
    

    如果您需要从代码的其他部分访问这些对象,而不明确地传递它们,请将它们放在合理命名的namespace中:

    // in header
    namespace a_and_b // this is *wrong* name for it, of course
    {
        extern A a;
        extern A b;
    }
    
    // in one of TUs - also possible to wrap this in namespace ... { ... }
    A a_and_b::a;
    A a_and_b::b(a_and_b::a);
    

    当然,如果您只是要求语法,答案是:

    A * b = new A(*a);
    

    所以只需取消引用A的{​​{1}}指针。但请不要这样做 - 即使在独立环境中,您也可以轻松实现自己的智能指针,以理智的方式包装它。

答案 1 :(得分:3)

只需使用new:

调用复制构造函数
b = new A(*a);

我不得不问......为什么不保留两个静态物体呢?

答案 2 :(得分:1)

如果你没有声明一个你总是得到一个隐式的构造函数,你可以像StoryTeller那样调用复制构造函数和析构函数;

b = new A(*a);

如果你想在复制构造函数中做任何事情,你需要写一个,这里有一些关于你如何做到这一点:http://www.cplusplus.com/articles/y8hv0pDG/