use*_*107 5 c++ class function
我不反对这句话: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 ;
}
Run Code Online (Sandbox Code Playgroud)
在void f()与以下几行定义一个函数,f这需要的参数和返回任何结果.
该行data f(); 声明了一个函数f,它不带参数但返回一个类型的对象data.既然我们已经看到了这个定义f,我们知道这一行实际上是骗我们的,但是编译器让它说谎,因为它希望与C保持兼容,而定义可能就是那个撒谎的人.
了解?
更新:
最初,C没有void关键字.所以,说f()没有返回任何东西,你只是停止了返回类型 - 除了设计师是懒惰的打字员,所以他们决定实际上使"未指定类型"意味着"默认为int",因为他们返回更多的int往往比没有.因此,f()可以定义一个不返回任何内容的函数或一个int.我认为编译器实际上很酷,你写的东西就像if (x==1) return 5; else return "five"; 让调用函数弄清楚返回值一样.
这带给我们的是data f();.因为你刚刚告诉编译器f()返回一个data对象,它会信任你,并忽略你之前告诉它的内容.当然,在main()函数之后,新的声明f()超出了范围,并且编译器返回使用原始签名f().
最重要的是,虽然是合法的,但它是非常糟糕的代码(tm),任何写它的人都应该被打耳光.
我不明白这个说法:
f().array;...是函数调用吗?或者访问类的属性?
两个都。它调用 function 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
Run Code Online (Sandbox Code Playgroud)