【问题标题】:Calling the constructor from the assignment operator从赋值运算符调用构造函数
【发布时间】:2017-10-06 17:18:42
【问题描述】:

我正在重载类 Arr 的赋值运算符。这是通过使用析构函数删除旧对象(并释放分配的内存)来实现的,然后使用复制构造函数(先前已重载)使调用对象成为 rhs 的副本。 this 图片显示了两种不同的方法(仅第 50 行和第 57 行不同)。为什么第二种方案有效,第一种无效?

错误信息是“类型名称不允许”

Arr& Arr::operator=(const Arr& rhs) {
    this->~Arr();
    this->Arr(rhs); // I get an error here: type name is not allowed
    return (*this);
}


Arr& Arr::operator=(const Arr& rhs) {
    this->~Arr();
    this->Arr::Arr(rhs);
    return (*this);
}

我知道可以使用复制和交换,但仍然:这里出了什么问题?

【问题讨论】:

  • 这段代码不是异常安全的,如果你知道交换,你为什么会问这样的问题?你为什么要写这么糟糕的代码!您的代码的问题是显式调用构造函数是非法的。在已分配的内存上调用构造函数的唯一方法是使用placement new(至少对于C++ 03)。如果第二种语法适用于您的编译器,那么我怀疑它是标准的。
  • “为什么第二种解决方案有效,但第一种无效?” - 可能是因为您使用了有缺陷的编译器或使用错误的选项集调用它。跨度>

标签: c++ constructor operator-overloading assignment-operator


【解决方案1】:

好吧,在 GCC 中两者都是不允许的。我的猜测是,如果您的编译器允许其中一个但不允许另一个,那么这是为了避免歧义。

当您编写this->Arr() 时,编译器无法知道您要调用构造函数,而不仅仅是实例化一个新对象。

当你写this->Arr::Arr(),那么编译器就知道你调用了Arr类的static函数Arr()

【讨论】:

    猜你喜欢
    • 2013-07-03
    • 2011-05-21
    • 2011-02-20
    • 2013-03-26
    • 1970-01-01
    • 2011-02-08
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多