下面的代码编译得很好(除非调用method
没有注释)。
.
extern "C"
{
struct S
{
int some_int;
void method(){}
};
}
int main()
{
S s();
// s.method();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
首先,S s();
声明一个名为的函数s
,它不接受任何参数并返回一个类型为 的对象S
。就像int f();
.
其次,这extern "C"
与这里无关。它大致用于用 C 编写并从 C++ 调用的函数。这并不意味着“假装这段代码是 C 代码”。
第三,S
确实有一个默认构造函数。编译器生成一个。在这种情况下,它什么都不做,因为没有S
需要非平凡初始化的成员。要使用您编写的默认构造函数S s;
或S s{};
.
第四,声明成员函数没问题的原因是C++中的astruct
和aclass
可以有成员函数。我知道,这听起来像是同义反复,但重要的是要记住 astruct
可以拥有成员函数、静态数据private
、protected
、 和public
成员,就像class
. astruct
和 a之间的唯一区别class
是,默认情况下,类的成员是私有的,而结构的成员是公共的,并且默认情况下,类的基是私有继承的,而结构的基是公开继承的。