num*_*l25 6 c c++ visual-studio-2008 visual-studio visual-c++
只是好奇为什么一个param必须是一个const操作重载
CVector& CVector::operator= (const CVector& param)
{
x=param.x;
y=param.y;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
难道你不能轻易做到这样的事吗?
CVector& CVector::operator= (CVector& param) //no const
{
x=param.x;
y=param.y;
return *this;
}
Run Code Online (Sandbox Code Playgroud)
当某些东西变成一个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;
a.x = 33;
B b;
b.x = 44;
a = b;//both a and b will be changed
return 0;
}
Run Code Online (Sandbox Code Playgroud)
参数const在使用它的整个函数中都是常量,它不会在其外部改变其常量。
在这种情况下,您需要声明一个 const 参数,以便您的赋值运算符既接受非 const 变量又接受 const 变量;特别是后一种情况,包括表达式的结果,它是一个临时 const 变量,您通常希望在赋值中支持它。