在 C 结构上调用默认构造函数
Calling the default constructor on c structs
下面的代码编译得很好(除非对 method
的调用未注释)。
- 为什么允许“调用”默认构造函数? (应该没有)
- 为什么成员函数的声明不报错?
.
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++中的struct
和class
可以有成员函数。我知道,这听起来有点同义,但重要的是要记住 struct
可以有成员函数、静态数据、private
、protected
和 public
成员,就像一个class
。 struct
和 class
之间的唯一区别是默认情况下 class 的成员是私有的,而结构的成员是 public,并且默认情况下是 a 的基类class 是私有继承,而结构的基础是 publicly 继承。
下面的代码编译得很好(除非对 method
的调用未注释)。
- 为什么允许“调用”默认构造函数? (应该没有)
- 为什么成员函数的声明不报错?
.
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++中的struct
和class
可以有成员函数。我知道,这听起来有点同义,但重要的是要记住 struct
可以有成员函数、静态数据、private
、protected
和 public
成员,就像一个class
。 struct
和 class
之间的唯一区别是默认情况下 class 的成员是私有的,而结构的成员是 public,并且默认情况下是 a 的基类class 是私有继承,而结构的基础是 publicly 继承。