繁体   English   中英

这句话是什么意思?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM