我遇到了这段代码,输入“坏”时效果不正常,我知道原因,但我不明白。我猜问题是在创建对象时。你能解释一下吗?
- 编辑。对不起,我把&它不是。 const 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;
}
}
}
答案 0 :(得分:0)
引用本质上充当别名。这意味着除非您为另一个对象分配引用,否则编译器将无法在何处查找指定的信息。在您的问题的情况下,字符串对象没有被分配给另一个对象的地址,而是被分配了一个字符串文字。简而言之,引用的行为类似于计算机文件系统中的快捷方式,因此当您使用快捷方式时,它实际上将使用快捷方式链接到的文件的信息(警告不是完美的比较)。然而,这并不是一个完美的类比,因为参考只是作为计算机内存中同一点的第二个名称。
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.
注意:您的编译器不会同时使用这两个变量,而是将两者都替换为单个对象的数字地址,该对象可以在运行时填充值
编辑:值得注意的是,使用const std::string &good = "hello";
完全没问题,因为编译器会识别出值不会改变,并且good
拥有它地址。