C ++ - 能够访问类方法而不是静态或创建对象的函数

时间:2016-11-27 11:23:13

标签: c++

我最近遇到过这段代码

#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类定义一个对象。

请给我一些提示。

2 个答案:

答案 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)

  1. A是类名,但是调用A()意味着调用类A的构造函数(a.k.a构造函数)。当调用构造函数时,它会生成该类的一个实例。在这种情况下,您没有提供自定义构造函数,因此编译器提供了没有参数的默认构造函数。
  2. return A();返回A()返回的内容。是的,返回了您刚刚创建的实例。

    1. 关键是:在调用并执行&#34;之后,知道&#34; bar()是什么。
        

      我的意思是我们甚至没有为A类定义一个对象。

    2. 你当然有。致电bar()完全是这样做的。