成员类作用域中的引用
reference in member class scope
我遇到了这段代码,它对于输入"bad"无法正常工作,我知道原因,但我不明白。我想问题是在创建对象时。你们能给我解释一下吗?
--编辑。对不起,我把 & 放在了它没有的地方。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;
}
}
}
引用本质上充当别名。这意味着,除非您将引用分配给另一个对象,否则编译器不会无处可寻到指定的信息。在您的问题中,字符串对象没有被分配给另一个对象,而是被分配了一个字符串文字。简而言之,引用的行为类似于计算机文件系统中的快捷方式,因此当您使用快捷方式时,它实际上将使用快捷方式链接到的文件的信息(警告不是一个完美的比较)。然而,这不是一个完美的类比,因为引用只是充当计算机内存中同一点的第二个名称。
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
它自己的地址。
相关文章:
- 未在作用域中声明unordered_map
- 有没有一种方法可以在编译时获得作用域类名
- C++quit()函数中可能存在作用域问题
- 为什么不能直接引用作用域枚举类成员,而不能为无作用域枚举生成类成员?
- 将非左值作为常量引用参数传递.临时是在本地作用域还是在调用方作用域中创建的?
- C++11 Lambda闭包通过引用涉及一个堆栈变量,该变量离开作用域是允许的,但得到了未定义的行为
- C++函数作用域中声明的返回引用
- 返回具有引用父作用域中变量的函数成员的结构
- 成员类作用域中的引用
- catch 块如何捕获对其他作用域中临时变量的引用
- 对临时对象的常量引用在函数作用域(生存期)后被破坏
- 未在此作用域中声明的信号/对class::方法的未定义引用
- 在c++中,当我通过引用传递一个对象时,它超出了作用域
- 是成员声明`decltype(name)name;`在第一个名称引用封闭作用域的本地结构中允许
- 当引用指向指针(堆中的对象)的对象时,引用作用域结束
- 作用域/引用计数迭代器
- 引用的C++变量作用域
- 如何在对int和作用域枚举的引用之间进行static_cast
- C++ 作用域结束后丢失指针引用
- 引用在函数作用域内定义的类