【问题标题】:reference in member class scope成员类范围内的引用
【发布时间】:2016-02-25 12:06:36
【问题描述】:

我遇到了这段代码,对于输入“bad”,它不能正常工作,我知道原因,但我不明白。我想问题出在创建对象时。可以给我解释一下吗?

--已编辑。抱歉,我把 & 放在了没有的地方。 常量 std::string& _badString; --> 这就是问题所在。如果您使用参数 'bad' 运行它,则会捕获异常,但是在打印应该是 'bad' 的字符串时,它只会打印垃圾。

#include <iostream>
#include <string>

namespace
{
    const std::string bad = "bad";
}

class MyException
{
    const std::string& _badString;

public:
    MyException(const std::string& s):
    _badString(s)
    {
    }

    auto badString() const
    {
        return _badString;
    }
};


template<typename Arg>
void interpretArg(Arg arg)
{
    if (arg == bad)
    {
         throw MyException(arg);
    }
}

int main(int argc, char** argv)
{
    for (int i = 0; i < argc; ++i)
    {
        try
        {
            interpretArg(argv[i]);
        }
        catch(const MyException& e)
        {
            std::cerr << "badString: " << e.badString() << std::endl;
        }
    }
}

【问题讨论】:

  • 我们如何知道对您来说“正常工作”意味着什么?
  • 好吧,我的意思是正确的。当参数为“坏”时,它应该捕获异常并打印“坏”

标签: c++ reference scope


【解决方案1】:

引用本质上充当别名。这意味着除非您将引用分配给另一个对象,否则编译器将不会无处可找到指定的信息。在您的问题的情况下,字符串对象没有被分配给另一个对象的地址,而是被分配了一个字符串文字。简而言之,引用的行为类似于计算机文件系统中的快捷方式,因此当您使用快捷方式时,它实际上会使用快捷方式链接到的文件的信息(警告不是一个完美的比较)。然而,这并不是一个完美的类比,因为引用只是充当计算机内存中同一点的第二个名称。

const std::string& bad = "bad";

考虑下图,其中两个变量共享相同的内存地址,因此本质上是相同的变量。你不能给引用赋值,因为你没有给它一个地址。

正确:

                     / var_name1
0x756 < ------------/
^^ address in memory\
                     \ &var_name2 = var_name1; // Copying address.

不正确:

                          / "some_string"
no_address < ------------/
^^ address in memory     \
                          \ &var_name2 = "some_string"; // Assigning string
                                                        // Instead of an
                                                        // address.

注意:您的编译器不会同时使用这两个变量,而是将这两个变量都替换为 single 对象的数字地址,该对象可以在运行时填充一个值.

编辑:值得注意的是,使用const std::string &amp;good = "hello"; 是完全可以的,因为编译器认识到该值不会改变并给good 它自己的地址。

【讨论】:

  • 感谢 bruffalobill 的解释。对不起,我放错了 & 符号。
猜你喜欢
  • 2018-07-21
  • 2012-06-25
  • 2014-02-07
  • 2011-09-14
  • 2012-04-10
  • 2013-02-16
  • 1970-01-01
  • 2015-09-11
  • 2016-11-22
相关资源
最近更新 更多