我不反对这句话: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 ;
}
答案 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