[英]What does this statement mean?
我不反对这句话: 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 ;
}
void f()
和后面的行定义了一个函数f
,它接受参数并且不返回任何内容。
行data f();
声明一个函数f,它不接受任何参数,但返回一个data
类型的对象。 既然我们已经看过f
的定义,我们知道这条线实际上是骗我们的,但是编译器让它说谎,因为它想要保持与C的兼容,而定义可能就是那个说谎的人。
了解?
更新:
最初,C没有void
关键字。 所以,假设f()
没有返回任何东西,你只是停止了返回类型 - 除了设计师是懒惰的打字员,所以他们决定实际上使“未指定类型”意味着“默认为int”因为它们是返回的内容往往比什么都没有。 因此, f()
可以定义一个不返回任何内容的函数或一个int。 我认为编译器实际上很酷,你写的是if (x==1) return 5; else return "five";
if (x==1) return 5; else return "five";
并让调用函数计算出返回值。
这带给我们data f();
。 由于您刚刚告诉编译器f()
返回一个data
对象,它会信任您,并忽略您之前告诉它的内容。 当然,在main()函数之后, f()
的新声明超出了范围,编译器返回使用f()
的原始签名。
最重要的是,虽然是合法的,但它是非常糟糕的代码(tm),任何写它的人都应该被打耳光。
我不反对这句话:
f().array;
...是函数调用? 或访问该类的属性?
都。 它调用函数f
,然后访问返回值的array
成员(但对它没有任何作用,使成员访问无意义)。
声明
data f();
是构造函数的调用?
不,这是一个功能声明。 在这种情况下,它应该给出一个错误,因为你已经用void
返回类型声明了f
。
要声明一个对象,您需要:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.