C++ - 引用和运算符=在这里做什么

C++ - What does reference& operator= do here

本文关键字:在这里 什么 运算符 引用 C++      更新时间:2023-10-16

我在阅读c++ 11 STL中关于向量的一些东西时遇到了这段代码。它使用operator=赋值。现在我不知道它到底是做什么的。

代码如下:

namespace std {
    template <typename Allocator> class vector<bool, Allocator> {
    public:
        // auxiliary proxy type for element modifications:
        class reference {
            ...
        public:
            reference& operator=(const bool ) noexcept; // assignments
            reference& operator=(const reference&) noexcept;
            operator bool( ) const noexcept; // automatic type conversion to bool
            void flip( ) noexcept;
            // bit complement
        };
        ...
        // operations for element access return reference proxy instead of bool:
        reference operator[]( size_type idx );
        reference at( size_type idx );
        reference front( );
        reference back( );
    };
}
从上面的代码中,我可以理解它返回一个类引用的类型。但是我不能理解的是这个表述reference& operator=(const reference&) noexcept;。请让我知道这句话在这种情况下的实际含义

reference类是所谓的代理,它伪装成另一种类型来赋予它无法获得的行为。在这种情况下,它取代了bool,因此它需要分配给bool。你可以看到在这个类中有两个operator=方法,一个取bool,一个取reference&

operator=的规则之一是它必须返回对对象的引用,以便您可以链接=操作符:

b1 = b2 = false;

使用reference作为一个类是一个糟糕的选择。但是…

函数

reference& operator=(const bool ) noexcept;

返回对reference类型对象的引用。函数中的返回语句很可能是这样的:

return *this;

取一个简单的类:

struct A
{
   A(int in) : data(in) {}
   A& operator=(int in)
   {
      data = in;
      return *this;
   }
   A& operator=(A const& rhs)
   {
      data = rhs.data;
      return *this;
   }
};

用法:

A a(10); // a.data is 10
a = 20;  // a.data is 20
A b(5);  // b.data is 5
a = b = 35; // a.data as well as b.data are 35

你是对的,它返回一个reference对象(实际上它返回一个reference对象的引用-这就是&的意思)。

方法名表明你重载了赋值操作符=

方法的参数意味着它接受对reference对象的不可变(const关键字)引用。

noexcept关键字保证该方法不会抛出异常。如果你违背了这个承诺,你的程序就会抛出一个运行时异常。

c++程序员会将其解释为复制赋值操作符。

相关文章: