我最近遇到过这段代码
#include<iostream>
using namespace std;
class A
{
public:
void foo() const { cout << "A::foo() const\n"; }
void foo() { cout << "A::foo()\n"; }
};
A bar() { return A(); }
const A cbar() { return A(); }
int main()
{
bar().foo();
cbar().foo();
}
我在这篇文章中读到了http://en.cppreference.com/w/cpp/language/return的回复声明:
在隐式转换为函数返回类型之后,计算表达式,终止当前函数并将表达式的结果返回给调用者。
A()是表达式吗?在遇到这段代码之前,我不会认为它甚至是一种有效的语法。
bar()基本上意味着bar()的返回类型是A,但是
我有两个问题:
1)A()和返回A()在函数栏()内部做什么?
2)bar()如何在A类中访问foo()而不是静态的? - 我的意思是我们甚至没有为A类定义一个对象。
请给我一些提示。
答案 0 :(得分:3)
1)A()和返回A()在函数栏()中做了什么?
A bar() { return A(); }
按值返回一个对象。这里A()
是将返回的新对象的构造。
2)如果没有静态的话,bar()如何访问A类中的foo()? - 我的意思是我们甚至没有为A级定义一个对象。
bar()
创建一个临时文件,您可以在其上调用const
个函数。它几乎像下面那样:
{
A _tmp(bar());
_tmp.foo();
}
在表达式bar().foo()
的持续时间内,临时值进入范围。 bar
的返回值初始化它,我们在该实例上调用成员函数。然后它立即超出范围。
答案 1 :(得分:3)
return A();
返回A()
返回的内容。是的,返回了您刚刚创建的实例。
我的意思是我们甚至没有为A类定义一个对象。
你当然有。致电bar()
完全是这样做的。