【问题标题】:data member int reference数据成员 int 引用
【发布时间】:2016-12-04 23:04:03
【问题描述】:

我试图通过引用将 int 存储为类的数据成员。 我希望这是通过引用获取 int 的对象,而不是从外部增加引用会增加对象内部的值。

class A
{
private :
    int& x;

public:
    A(int y) : x(y)
    {
        cout << "A's ctor x = " << x << endl;
    }

    void print()
    {
        cout << "x = " << x << endl;
    }


};

int main()
{
    int i = 8;
    A a(i);
    a.print();
    ++i;
    a.print();
}

输出是:

A's ctor x = 8
x = 8
x = 8

为什么 x 不是 9?

【问题讨论】:

  • 你认为x (注意时态)引用什么?提示:不是i。剧透:A(int&amp; y)。调高你的警告级别。您应该已经收到“将引用成员 'x' 绑定到堆栈分配的参数 'y'”的警告

标签: c++ reference pass-by-reference


【解决方案1】:

问题是您将临时(构造函数参数y)绑定到引用。临时对象的生命周期仅限于构造函数,但您的引用仍然存在,成为“悬空”引用。这是一个合理的编译器对此事的看法:

crap13.cpp:10:18:警告:将引用成员“x”绑定到堆栈分配的参数“y”[-Wdangling-field]

A(int y) : x(y)

您可以通过将构造函数参数设为引用来“修复”此问题:

A(int& y) : x(y)

但您必须确保作为参数传递给构造函数的任何内容都比正在构造的对象的寿命更长。

【讨论】:

  • 这是 gcc 的警告吗? clang 给出了相同的消息,但没有注意到归因于发射的警告标志。只是好奇。 (就像文件名,顺便说一句 =P)
  • @WhozCraig 这是一个相当新的 clang 版本,与 xcode 捆绑在一起。
  • 我用的是那个。最新更新(我认为):Apple LLVM 版本 7.0.2 (clang-700.1.81)。奇怪的。谢谢。
  • @WhozCraig 在最近一次操作系统升级后,我得到了 Apple LLVM 版本 7.3.0 (clang-703.0.31)
  • 你在运行 El Capitan 吗?我还在优胜美地。可能有关系。我只是还不能让hutzpah拉动杠杆。
【解决方案2】:

问题是你在构造函数中通过值传递 int,你应该通过引用传递它:

A(int& y) : x(y)
{
    cout << "A's ctor x = " << x << endl;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-01
    • 2013-05-02
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    相关资源
    最近更新 更多