const
- 我认为这是保证该方法不会更改对象(的不可变成员)。而且我还知道我们可以附加
noexcept
来保证该方法不会抛出异常。我最近偷看了一些图书馆,发现一些班级成员在签名末尾带有
&
或
&&
;我不熟悉。当然,我知道
&
和
&&
用于标记参考文献。但是 - 它们在成员函数签名末尾意味着什么?
&
和
&&
标记与
const
标记非常相似 - 但与您感知的方式不完全一样。简介#1:左值与右值参考
&&
),而不是左值引用 (
&
)。参见:
int MyClass::foo(int x)
在该方法中,您可以引用参数 x
,也可以引用调用成员函数的对象:如果您调用
my_obj.foo(my_var)
,则在
foo
的主体中,您可以引用
my_obj
隐式定义的对象(我们称之为
this_obj_ref
);每当在
foo()
的实现中,您使用 MyClass 的成员(例如
MyClass::bar
)时,您实际上是在告诉编译器使用
this_obj_ref.bar
。
(另外,this
是你的对象的地址;但出于某种原因,我没有用`this来解释上面的内容。)因此,我们可以将该方法视为一个独立的函数,其签名为:
int MyClass_foo(MyClass& this_obj_ref, int x)
成员函数的限定符 = 隐式对象引用的限定符
this_object_ref
隐式参数。所以,
int MyClass::foo(int x) const
意味着该方法将像这样被调用:
int MyClass_foo(MyClass const & this_obj_ref, int x)
这意味着无论 my_obj
是否为常量 MyClass 对象,您都可以使用它;而原始的
foo
仅当
my_obj
是非常量时才能使用。如果我们使用
&
和
&&
,我们表明该方法只能与lvalue vs rvalue 引用一起使用:
int MyClass::foo(int x) &
| int MyClass_foo(MyClass & this_obj_ref, int x)
|
int MyClass::foo(int x) &&
| int MyClass_foo(MyClass && this_obj_ref, int x)
|