这句话是什么意思?

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)

Jam*_*ran 5

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),任何写它的人都应该被打耳光.


Mik*_*our 1

我不明白这个说法: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)