恒定参考如何起作用
How do constant references work?
最近,我一直在学习C 中的良好编程实践,发现许多程序通过参考将对象传递给函数,因此未创建多个实例。我还了解到,通过常数引用可以防止原始对象被修改,但是我不明白这是如何工作的。不应该创建新实例,因为无法通过引用修改原始对象,但是引用仍然可以像单独的对象一样使用?我可以肯定的是,这不是运作方式,而是它的工作原理?我错过了什么吗?
我还了解到,通过常数引用可以防止原始对象被修改[...]
不完全。您不允许通过 const &
修改对象。换句话说,您只读访问。但是,没有什么可以在本地阻止使用读写访问的其他代码(例如,引用对象的原始所有者(来修改它。您确实需要在设计时要小心,以使您的更改不会令您感到惊讶。
常数引用(const&
(类似于指向常数对象的指针。您可以通过参考阅读,但不能对其进行修改。其他,持有 non -const reference can 仍将其修改。
不应该常量参考创建新实例,因为 原始对象不能通过参考来修改,而是 参考仍然可以像单独的对象一样使用?
最好将其称为引用常数对象。这使事物的工作原理更加清晰。将其称为另一种方式只是令人困惑的,因为任何参考都是恒定的(这意味着您在初始化后不能让它引用另一个对象(。
因此,对常数对象的引用只是现有对象的附加名称(例如非const reference(,该名称仅允许读取,从现有对象。
这意味着通过引用常数对象您可以:
- 除非成员标记为
mutable
- 仅调用标记为
const
的对象的方法
示例:
struct Foo
{
int a;
mutable int b;
void SetA( int newA ) { a = newA; }
int GetA() const { return a; }
};
void DoSomething( const Foo& f )
{
// Here, f is just another name for foo, but it imposes some restrictions:
f.a = 42; // compiler error, can't modify member!
f.SetA( 42 ); // compiler error, can't call non-const method!
int x = f.a; // OK, reading is allowed.
f.b = 42; // OK, because b is marked as mutable
int y = f.GetA(); // OK, because GetA() is marked as const
}
int main()
{
Foo foo;
DoSomething( foo );
}
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 恒定参考如何起作用
- 将参考类型作为嵌套模板结构中的模板参数作为模板参数不起作用
- 基于范围的循环中的const参考不起作用
- 为什么此C 代码不起作用 - 试图删除集合中的元素时,请参考错误
- 为什么具有通用参考的重载(使用 enable_if)不起作用?