相关疑难解决方法(0)

运算符重载的基本规则和习惯用法是什么?

注意:答案是按照特定的顺序给出的,但由于许多用户根据投票而不是给出的时间对答案进行排序,因此这里是答案索引,它们是最有意义的顺序:

(注意:这是Stack Overflow的C++常见问题解答的一个条目.如果你想批评在这种形式下提供常见问题解答的想法,那么发布所有这些的元数据的发布将是这样做的地方.这个问题在C++聊天室中受到监控,其中FAQ的想法一开始就出现了,所以你的答案很可能被那些提出想法的人阅读.)

c++ operator-overloading operators c++-faq

2074
推荐指数
8
解决办法
88万
查看次数

在C++中重载赋值运算符

据我所知,当重载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)

但为什么要返回参考?如果返回值未被声明为引用,它会在什么情况下产生问题,让我们说按值返回?

假设正确实现了复制构造函数.

c++ operator-overloading assignment-operator

16
推荐指数
2
解决办法
7145
查看次数

有没有人发现需要声明复制赋值运算符const的返回参数?

复制赋值运算符具有通常的签名:

    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)

您只能定义一个或另一个,但不能同时定义两者.

c++ assignment-operator

11
推荐指数
3
解决办法
2404
查看次数

是否有正当理由不从复制赋值运算符返回*this?

我们foo是一个结构或类与拷贝赋值运算符:

struct foo {
    foo &operator=(const foo &);  // or with some other return type?
};
Run Code Online (Sandbox Code Playgroud)

是否有一个合理的退货理由比其他任何东西*thisoperator=()?将它用于与任务无关的事情并不合理.

c++ copy-assignment

11
推荐指数
1
解决办法
187
查看次数

操作符重载是否可以在没有引用的情

根据Bjarne Stroustrup的说法,引用了C++以支持运算符重载:

引用的引用主要是为了支持运算符重载.

C按值传递每个函数参数,并且按值传递对象的效率低或不合适,用户可以传递指针.在使用运算符重载的情况下,此策略不起作用.在这种情况下,符号方便是必不可少的,因为如果对象很大,则不能期望用户插入地址运算符.例如:

a = b - c;
Run Code Online (Sandbox Code Playgroud)

是可接受的(即常规的)符号,但是

a = &b - &c;
Run Code Online (Sandbox Code Playgroud)

不是.无论如何,&b - &c在C中已经有了意义,我不想改变它.

在语言中使用指针和引用是C++新手混淆的常见原因.

Bjarne不能通过引入一种特殊的语言规则来解决这个问题,如果存在需要这样的指针的用户定义的运算符函数,它允许对象参数衰减成指针吗?

减法的声明和用法将如下所示:

Foo operator-(const Foo* x, const Foo* y);
a = b - c;
Run Code Online (Sandbox Code Playgroud)

有没有提出/考虑过这样的解决方案?它有任何严重的缺点吗?

是的我知道,由于它们的限制,引用提供了其他优点,但这不是重点.

有趣的是,带有类的C的赋值运算符似乎完全相同:

通过声明一个名为的成员函数来更改类[...]对象的赋值含义operator=.例如:

class x {
public:
    int a;
    class y * p;
    void operator = (class x *);
};
Run Code Online (Sandbox Code Playgroud)

c++ history language-design reference operator-overloading

6
推荐指数
2
解决办法
2044
查看次数

在c ++中返回重载赋值运算符的类型

可能重复:
为什么复制赋值运算符必须返回引用/ const引用?
Operator =在C++中重载

我已经问过一个关于这个赋值运算符重载的问题.我可能会问一个愚蠢的问题.对不起.

我的班级声明是这样的:

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 = …

c++ operator-overloading

4
推荐指数
1
解决办法
5210
查看次数

为什么移动赋值运算符应返回对* this的引用

有人可以解释为什么移动分配运算符(通常)声明为

Foo& operator=(Foo&&);
Run Code Online (Sandbox Code Playgroud)

为什么返回引用而不返回eg FooFoo&&?我理解为什么我们要对常规赋值运算符使用此方法,因为(a=b)=c如果没有通过引用返回,则关联规则在逻辑上被破坏(尽管仍然可以编译),但是为什么RHS是右值(xvalue / prvalue)时会出现这种情况?

c++ move-semantics c++11

3
推荐指数
1
解决办法
342
查看次数

为什么在仍然通过时需要返回*this?

我写了下面的类,它重载了赋值运算符.如示例所示,我*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 =然后为什么需要从赋值运算符返回它?

c++ class operator-overloading assignment-operator

1
推荐指数
1
解决办法
147
查看次数