c/c++语言开发共享为什么必须在运算符重载中提供关键字const

只是好奇为什么一个param必须是一个const操作重载

CVector& CVector::operator= (const CVector& param) { x=param.x; y=param.y; return *this; } 

难道你不能轻易做到这样的事吗?

 CVector& CVector::operator= (CVector& param) //no const { x=param.x; y=param.y; return *this; } 

当某些东西变成const时,它对于应用程序生命的其余部分是不可改变的? 这在操作重载方面有何不同?

    const参数在使用它的整个函数中都是const,它不会在它之外改变它的常量。

    在这种情况下,您需要声明一个const参数,以便赋值运算符接受非const变量和const变量; 特别是后一种情况,包括表达式的结果,这是一个临时的const变量,你通常希望在赋值中支持它。

    你不需要const:

    @ numerical25:好奇为什么一个param必须是一个const操作重载

    这不是必需的,但这是一个很好的设计决策。

    请参阅C ++标准第12.8-9节:

    用户声明的复制赋值运算符X :: operator =是类X的非静态非模板成员函数,只有一个参数类型为X,X&,const X&,volatile X&或const volatile X&


    我认为这是一个好主意:

    使用const参数对我来说似乎是一个逻辑设计决策,因为您希望确保不会更改其他值。

    它告诉其他人使用你的类,当你说出类似的东西时,你不会改变other值: myObject = other; 并强制执行此操作,以便您不会意外更改other

    此外,如果您允许对对象的非const引用作为参数,那么您将限制可以使用您的函数的对象数量。 如果它是const,它可以用于const和非const的参数。 如果您的参数是非const,则它只能由非const的参数使用。


    const仅适用于当前引用,而不适用于对象:

    @ numerical25:当某些东西变成一个const时,它对于应用程序生命的其余部分是不可改变的? 这在操作重载方面有何不同?

    const引用只是一个const引用。 它不会改变您传入的实际对象的常量。


    非const运算符重载的示例:

    以下是运算符重载的示例,其中参数不是const。
    我不建议你做这件事:

     class B { public: const B& operator=(B& other) { other.x = 3; x = other.x; return *this; } int x; }; void main(int argc, char** argv[]) { B a; ax = 33; B b; bx = 44; a = b;//both a and b will be changed return 0; } 

    如果你用过

     CVector& CVector::operator= (CVector& param) // no const 

    然后做了这个:

     const CVector& my_vector = GetMyVector(); some_other_vector = my_vector; // call assignment operator - error! 

    您将收到错误,因为my_vector是一个const CVector&并且无法转换为CVector& (非const引用)。 它只是在operator= function中的本地引用,它是const,而不是整个对象本身。

    您可以使用非常量变量,但这有两个影响,一个是function性的,另一个是关于您作为函数的编写者告诉用户的内容。

    1)调用带有非const引用的函数的人将无法使用const变量调用它

    2)当你有一个非const引用的函数参数时,你发出信号,“我保留改变它的权利”。 通常,当您的函数的用户写a = b;时,他不希望b改变。

    请注意,您可以使用第三个选项,即按值传递:

     CVector& CVector::operator= (CVector param) //no reference 

    这没有我上面提到的任何问题。 但是,效率非常低。 由于这三个因素,通过引用到const是优选的,特别是在像复制可能很昂贵的向量的情况下。

    出于同样的原因,你可以在任何地方使用const:确保将来对方法的更改不会无意中修改传入的参数,以帮助记录接口通知调用者传递param是安全的,而不会有更改的风险,并且允许调用者传入在调用代码中声明为const的引用。

    另一个原因是允许转换。 例如:

     string s = "foo"; s = "bar"; 

    这里,实现可能选择仅提供赋值运算符,该赋值运算符将对字符串的const引用作为参数,并依赖编译器使用构造函数从char *“bar”创建临时字符串。 如果op =’s参数不是const,这将无效,因为您无法将临时绑定到非const引用。

    const限定符使传递的参数(在您的示例中为’const CVector&param’)为只读。 const限定符确保在operator =()方法中不更改参数(param)。

    如果没有const限定符,则可能存在以下情况:

     CVector& CVector::operator= (CVector& param) { x=param.x; y=param.y; param.x = 10; // some random value param.y = 100; return *this; } 

    在将值赋给左侧操作数之后,上述方法改变右侧操作数’param’。 const限定符可帮助您不要违反赋值操作的语义。

      以上就是c/c++开发分享为什么必须在运算符重载中提供关键字const相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560310.html

      (0)
      上一篇 2021年1月27日
      下一篇 2021年1月27日

      精彩推荐