【问题标题】:C++ : Array of Objects of a Class with Overloaded ConstructorsC++:具有重载构造函数的类的对象数组
【发布时间】:2024-01-19 08:06:01
【问题描述】:

假设我有一个类“myclass”-:

class myclass
{
public:
    int n;
    myclass(int n=0)
    {
        this->n=n;
    }
    myclass(myclass &a)
    {
        this->n=a.n;
    }
    ~myclass()
    {
        cout<<n<<"\n";
    }
};  

现在我想创建一个“myclass”对象数组,如下所示-:

int main()
{
    myclass arr[]= {5};  // Only 1 element for simplicity...
}

但是当我这样做时,我得到以下错误-:

在函数“int main()”中:
|47|错误:没有匹配函数调用“myclass::myclass(myclass)”
|47|注意:候选人是:
|36|注意:myclass::myclass(myclass&)
|36|注意:没有已知的参数 1 从“myclass”到“myclass&”的转换
|32|注意:myclass::myclass(int)
|32|注意:没有已知的参数 1 从“myclass”到“int”的转换

但是当我从类中删除复制构造函数 myclass(myclass &amp;a) 时,我没有收到任何错误并且一切正常......

所以现在我的问题是-:

1)。为什么会这样?? myclass(int n=0) 不是比这里的复制构造函数更好匹配吗??

2)。考虑到我想要复制构造函数和我的类中的整数构造函数,如何成功编译它??

注意:我在 Ubuntu 13.04 上使用 GCC 版本 4.7.3(如果有任何相关性。)

【问题讨论】:

  • 复制构造函数不应该采用const myclass&amp; a吗?
  • @nvoigt 两者都是合法的,并且在极少数情况下(如std::auto_ptr)复制构造函数确实采用非常量引用。但通常:您希望能够复制临时对象(这需要 const ref),并且您不修改正在复制的对象(因此您可以使用 const ref)。

标签: c++ arrays constructor copy-constructor constructor-overloading


【解决方案1】:

这种情况下的初始化语义是复制 初始化。复制初始化正式将 争论,然后复制它。转换后的论点不是 左值,所以它不能绑定到你的非常量引用 复制构造函数。如果您不定义复制构造函数, 编译器为你定义了一个,它需要一个 const 参考。你是复制构造函数应该带一个 const 参考也是如此,因为它不会修改其参数。

注意编译器可以优化出副本 建造。但前提是该程序是合法的,如果它 没有。

【讨论】:

  • 我会投票支持它,但我没有足够的声誉。我会尽快投票。无论如何感谢您的帮助..!!
【解决方案2】:

考虑到我在我的类中同时需要复制构造函数和整数构造函数,如何成功编译它?

const添加到复制构造函数的引用参数可以解决这个问题:

myclass(const myclass &a) : n(a.n) {}

Demo on ideone.

【讨论】:

  • 哦,是的!忘记了“5”是一个常量值。非常感谢!
  • @AnmolSinghJaggi 5 的类型为 int,而不是 int const;它是一个右值,所以不能是 cv 限定的。而5 作为myclass( int ) 的参数。它是由myclass( int ) 创建的临时对象的副本,如果复制构造函数采用非常量引用,则会失败。
  • @JamesKanze 你是对的!但是你所说的“cv-qualified”到底是什么意思??
  • @AnmolSinghJaggi 获得constvolatile 的资格。 (“cv-qualified”是标准中为此使用的术语。)