C++ - 引用和运算符=在这里做什么
C++ - What does reference& operator= do here
我在阅读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++程序员会将其解释为复制赋值操作符。
相关文章:
- 努力将整数转换为链表。不知道我在这里做错了什么
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 我正在尝试使用 while 循环从字符串中删除字母,直到没有字母。我在这里做错了什么?
- 我的C++合并排序代码不起作用。我在这里错过了什么?
- istringstream,num1 和 num2 在这里发生了什么?
- 编译器在这里做什么,允许在很少进行实际比较的情况下比较许多值
- 使用大括号实例化 - 它是什么,为什么在这里使用它?
- & 符号在这里做什么?
- 我做错了什么?C++新手在这里
- 新手在这里,到底什么是 acquireLock(),它的目的是什么?
- 类介绍 (c++) 项目希望我们创建两个构造函数,但它们都不需要任何参数 - 我应该在这里做什么?
- 如果这不是 boost::lockfree::d etail::freelist 中的错误,我在这里错过了什么
- 如何从C 中的HDF5文件中读取属性名称和数据集名称,在这里我不知道HDF5文件中存在什么属性
- 此代码的输出是什么?我在这里错过了什么吗?
- 我在这里滥用继承权吗?什么是最佳实践替代方案/模式?
- 这个指针增量操作在这里实现了什么
- 为什么 x 0 在这里,x=1 语句中发生了什么?
- 将C 节俭代码汇编为接口Cassandra会导致以下错误.我们在这里缺少什么
- 我在这里使用"cin.get"有什么问题?