这句话是什么意思?

时间:2014-07-29 14:03:33

标签: c++ function class

我不反对这句话:f().array; ...... 是一个函数调用?或访问该类的属性? 语句data f();是构造函数的调用吗?那是对的吗?

#include <iostream>
using namespace std;

void f()
{
    cout << "hello!" << endl;
}

struct data 
{ 
    int array[10]; 
};

int main()
{
    data f();

    f().array;

    return 0 ;
}

2 个答案:

答案 0 :(得分:5)

void f()及以下行定义了一个函数f,它接受​​参数并且不返回任何内容。

data f();声明了一个函数f,该函数不带参数但返回类型为data的对象。既然我们已经看到了f的定义,我们知道这一行实际上是骗我们的,但是编译器让它说谎,因为它想要保持与C的兼容,其中定义可能是一个撒谎的人。

知道了吗?

更新:

最初,C没有void关键字。所以,要说f()没有返回任何东西,你只是停止了返回类型 - 除了设计师是懒惰的打字员,所以他们决定实际制作&#34;类型未指定&#34;意思是&#34;默认为int&#34;因为他们更经常地返回整数。因此,f()可以定义一个不返回任何内容或int的函数。我认为编译器实际上很酷,你编写类似if (x==1) return 5; else return "five";的东西,并让调用函数计算出返回值。

这将我们带到data f();。由于您刚刚告诉编译器f()返回data个对象,它会信任您,并忽略您之前说过的内容。当然,在main()函数之后,f()的新声明超出了范围,编译器返回使用f()的原始签名。

最重要的是,虽然是合法的,但这是非常糟糕的代码(tm),写下它的人应该被打耳光。

答案 1 :(得分:1)

  

我不反对这句话:f().array; ...是一个函数调用?或访问类的属性?

两者。它调用函数f,然后访问返回值的array成员(但对它没有任何作用,使成员访问毫无意义)。

  

声明data f();是构造函数的调用吗?

不,这是一个功能声明。在这种情况下,它应该会出错,因为您已经使用f返回类型声明了void

要声明对象,您需要:

data f;          // default-initialisation: leaves the array uninitialised
data f{};        // value-initialisation (since C++11): zero-initialise the array
data f = data(); // value-initialisation (historic): zero-initialise the array