注意:答案是按照特定的顺序给出的,但由于许多用户根据投票而不是给出的时间对答案进行排序,因此这里是答案的索引,它们是最有意义的顺序:
(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)
据我所知,当重载operator =时,返回值应该是非const引用.
A& A::operator=( const A& )
{
// check for self-assignment, do assignment
return *this;
}
Run Code Online (Sandbox Code Playgroud)
在以下情况下允许调用非const成员函数是非const的:
( a = b ).f();
Run Code Online (Sandbox Code Playgroud)
但为什么要返回参考?如果返回值未被声明为引用,它会在什么情况下产生问题,让我们说按值返回?
假设正确实现了复制构造函数.
复制赋值运算符具有通常的签名:
my_class & operator = (my_class const & rhs);
Run Code Online (Sandbox Code Playgroud)
以下签名是否有实际用途?
my_class const & operator = (my_class const & rhs);
Run Code Online (Sandbox Code Playgroud)
您只能定义一个或另一个,但不能同时定义两者.
我们foo是一个结构或类与拷贝赋值运算符:
struct foo {
foo &operator=(const foo &); // or with some other return type?
};
Run Code Online (Sandbox Code Playgroud)
是否有过一个合理的退货理由比其他任何东西*this从operator=()?将它用于与任务无关的事情并不合理.
根据Bjarne Stroustrup的说法,引用了C++以支持运算符重载:
引用的引用主要是为了支持运算符重载.
C按值传递每个函数参数,并且按值传递对象的效率低或不合适,用户可以传递指针.在使用运算符重载的情况下,此策略不起作用.在这种情况下,符号方便是必不可少的,因为如果对象很大,则不能期望用户插入地址运算符.例如:
Run Code Online (Sandbox Code Playgroud)a = b - c;是可接受的(即常规的)符号,但是
Run Code Online (Sandbox Code Playgroud)a = &b - &c;不是.无论如何,
&b - &c在C中已经有了意义,我不想改变它.
在语言中使用指针和引用是C++新手混淆的常见原因.
Bjarne不能通过引入一种特殊的语言规则来解决这个问题,如果存在需要这样的指针的用户定义的运算符函数,它允许对象参数衰减成指针吗?
减法的声明和用法将如下所示:
Foo operator-(const Foo* x, const Foo* y);
a = b - c;
Run Code Online (Sandbox Code Playgroud)
有没有提出/考虑过这样的解决方案?它有任何严重的缺点吗?
是的我知道,由于它们的限制,引用提供了其他优点,但这不是重点.
有趣的是,带有类的C的赋值运算符似乎完全相同:
通过声明一个名为的成员函数来更改类[...]对象的赋值含义
operator=.例如:Run Code Online (Sandbox Code Playgroud)class x { public: int a; class y * p; void operator = (class x *); };
我已经问过一个关于这个赋值运算符重载的问题.我可能会问一个愚蠢的问题.对不起.
我的班级声明是这样的:
class Circle
{
public:
Circle();
Circle(const Circle &);
Circle(unsigned short rad);
unsigned short getRadius() const { return itsradius; }
void setRadius(unsigned short rad) { itsRadius = rad; }
private:
unsigned short itsRadius:
};
Run Code Online (Sandbox Code Playgroud)
我的班级定义:
Circle::Circle()
{
itsRadius = 0;
}
Circle::Circle(unsigned short rad)
{
itsRadius = rad;
}
Circle::Circle(const Circle & rhs)
{
itsRadius = rhs.getRadius();
}
Run Code Online (Sandbox Code Playgroud)
我正在重载赋值运算符,如下所示:
SimpleCircle & SimpleCircle::operator=(const SimpleCircle & rhs)
{
itsRadius = rhs.getRadius();
return *this;
}
Run Code Online (Sandbox Code Playgroud)
当我们处理当前对象如"itsRadius = …
有人可以解释为什么移动分配运算符(通常)声明为
Foo& operator=(Foo&&);
Run Code Online (Sandbox Code Playgroud)
为什么返回引用而不返回eg Foo或Foo&&?我理解为什么我们要对常规赋值运算符使用此方法,因为(a=b)=c如果没有通过引用返回,则关联规则在逻辑上被破坏(尽管仍然可以编译),但是为什么RHS是右值(xvalue / prvalue)时会出现这种情况?
我写了下面的类,它重载了赋值运算符.如示例所示,我*this从赋值运算符返回.
class Sample
{
int *p;
int q;
public:
Sample()
{
cout<<"Constructor called"<<endl;
p = new int;
q = 0;
}
Sample& Sample::operator =(const Sample &rhs)
{
cout<<"Assignment Operator"<<endl;
if(this != &rhs)
{
delete p;
p = new int;
*p = *(rhs.p);
}
return *this;
}
void display()
{
cout<<"p = "<<p<<" q = "<<q<<endl;
}
};
Run Code Online (Sandbox Code Playgroud)
当我调用赋值运算符时a = b,就像,a.operator=(b);.
现在我正在调用一个运算符函数,这已经被传递,operator =然后为什么需要从赋值运算符返回它?