在 C 结构上调用默认构造函数

Calling the default constructor on c structs

下面的代码编译得很好(除非对 method 的调用未注释)。

  1. 为什么允许“调用”默认构造函数? (应该没有)
  2. 为什么成员函数的声明不报错?

.

extern "C"
{
    struct S
    {
        int some_int;
        void method(){}
    };
}

int main()
{
    S s();
//    s.method();
    return 0;
}

添加默认构造函数(虽然它在这里是可选的)并使用 curly-braces 而不是括号,或者您甚至不需要使用它,将解决您的问题:

....
struct S {
    S() {} // declaring the constructor explicitly here
};
....

int main(void) {
    S s{}; // Don't use s() - a function, instead, call the
           // default constructor
//  S s;
    s.method();

    return 0;
}

首先,S s(); 声明了一个名为 s 的函数,它不带任何参数,returns 声明了一个 S 类型的对象。就像 int f();.

其次,extern "C" 与此处无关。它大致用于用 C 编写并从 C++ 调用的函数。这并不意味着“假装这段代码是 C 代码”。

第三,S是否有默认构造函数。编译器生成一个。在这种情况下,它什么都不做,因为 S 中没有需要 non-trivial 初始化的成员。要使用默认构造函数,您可以编写 S s;S s{};.

第四,声明成员函数可以的原因是C++中的structclass可以有成员函数。我知道,这听起来有点同义,但重要的是要记住 struct 可以有成员函数、静态数据、privateprotectedpublic 成员,就像一个classstructclass 之间的唯一区别是默认情况下 class 的成员是私有的,而结构的成员是 public,并且默认情况下是 a 的基类class 是私有继承,而结构的基础是 publicly 继承。