【问题标题】:C++ Operator Overloading in Class with Const Members? [closed]具有 const 成员的类中的 C++ 运算符重载? [关闭]
【发布时间】:2016-07-31 16:49:18
【问题描述】:
class SomeClass {
    int someNum;
    const int someConst;
    public:
        SomeClass() : someNum(12), someConst(15)
        {
        }
        SomeClass operator+(int num) {
            SomeClass newSomeClass;
            newSomeClass.someNum += num;
            return newSomeClass;
        }
};

int main() {
    SomeClass someClass;
    SomeClass newClass;
    newClass = someClass + 3;
}

我不明白为什么上面没有编译,但是在删除了 const 相关代码时会编译。

【问题讨论】:

  • 也许查一下const是什么意思?
  • 您认为newClass = someClass + 3; 会如何工作?
  • 如果有一个函数可以打印出 someNum,我希望它在 newClass 中的值是 15。就 juanchopanza 而言,是因为 newClass 被分配了一个新的 someConst ,它具有不同的内存地址,尽管值相同?如果是这样,我将如何在具有 consts 的类中使用运算符重载?
  • "...为什么上面没有编译.." - 当它编译失败时,发出的错误消息,你不方便地从你的帖子中省略了,肯定会试图扩展一些原因 为什么?专业提示:如果您曾经错误有任何疑问,您的问题应该逐字包含错误消息,以及您对您的想法的评估意思是。

标签: c++ constants overloading operator-keyword


【解决方案1】:

问题出在这里:

SomeClass newClass;
newClass = someClass + 3;

使用第一条指令创建对象 newClass 并初始化成员变量:

[...] someNum(12), someConst(15) [...]

使用第二条指令,您尝试将由 operator+ 构造的新对象分配给该对象。

所以实际上您是在尝试修改具有 const 变量成员的对象本身。

C++ 提供了一个默认的赋值运算符

newClass = someClass + 3;

意思是“把右边的对象中的所有变量mambers复制到左边的对象中”

在这种情况下,变量 someConst 被声明为常量值,因此您不能覆盖它的值。确实该操作会产生编译错误。

解决方案

为了处理这个“问题”,您需要编写一个自定义赋值运算符

这是一个例子:

class SomeClass {
int someNum;
const int someConst;
public:
    SomeClass() : someNum(12), someConst(15)
    {
    }
    SomeClass operator+(int num) {
        SomeClass newSomeClass;
        newSomeClass.someNum += num;
        return newSomeClass;
    }

   // Custom assignment operator
   SomeClass& operator=(const SomeClass& oth) {
     if (this != &oth) {
       this->someNum = oth.someNum;
     }
     return *this;
   }
};

这样你就告诉从一个对象中复制成员变量 someNum 并避免使用成本成员。

【讨论】:

    猜你喜欢
    • 2012-02-11
    • 2013-11-09
    • 2011-03-28
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多