首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >常量引用是如何工作的?

常量引用是如何工作的?
EN

Stack Overflow用户
提问于 2017-06-24 14:09:16
回答 3查看 865关注 0票数 0

最近,我一直在学习C++中的良好编程实践,并发现许多程序通过引用将对象传递给函数,这样就不会创建多个实例。我还了解到,传递一个常量引用可以防止修改原始对象,但是我不明白这到底是如何工作的。常量引用不应该创建一个新实例,因为不能通过引用修改原始对象,但是引用仍然可以像单独的对象一样使用吗?我相当肯定,这不是它的工作方式,而是它是如何工作的?我错过了什么吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-24 14:15:01

我还了解到,传递常量引用可以防止修改原始对象.

不完全是。不允许通过const &修改对象。换句话说,您有只读访问权限。但是,没有什么可以阻止具有读写访问权限的其他代码(例如,所引用对象的原始所有者)对其进行修改。您确实需要在设计时小心,这样才不会让您感到惊讶。

票数 8
EN

Stack Overflow用户

发布于 2017-06-24 14:12:59

常量引用(const&)类似于指向常量对象的指针。您可以通过引用读取它,但不能修改它。其他的,持有非const引用仍然可以修改它。

票数 0
EN

Stack Overflow用户

发布于 2017-06-24 15:41:08

常量引用不应该创建一个新实例,因为不能通过引用修改原始对象,但是引用仍然可以像单独的对象一样使用吗?

最好将其称为对常量对象引用。这使得事情的运作更加清晰。相反地调用它只是让人困惑,因为任何引用都是常量(这意味着在初始化后不能让它引用另一个对象)。

因此,对常量对象的引用仅仅是现有对象的附加名称(就像非const引用),其限制是该名称只允许从现有对象读取

这意味着,通过引用常量对象,您可以:

  • 只从对象的成员变量读取,但不分配给它们,除非成员被标记为mutable
  • 只调用标记为const的对象的方法

示例:

代码语言:javascript
运行
复制
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 );
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44737261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档