在c++中,结构可以有构造函数吗?
我一直试图解决这个问题,但我没有得到语法。
在c++中,结构可以有构造函数吗?
我一直试图解决这个问题,但我没有得到语法。
当前回答
注意这里有一个有趣的区别(至少在MS c++编译器中):
如果你有一个像这样的普通结构
struct MyStruct {
int id;
double x;
double y;
} MYSTRUCT;
然后在其他地方,你可以初始化一个这样的对象数组:
MYSTRUCT _pointList[] = {
{ 1, 1.0, 1.0 },
{ 2, 1.0, 2.0 },
{ 3, 2.0, 1.0 }
};
然而,一旦你添加一个用户定义的构造函数到MyStruct,比如上面讨论的那些,你会得到这样一个错误:
'MyStruct':带有用户定义构造函数的类型不是聚合的 <文件和行>:错误C2552:“_pointList”:非聚合不能 使用初始化列表初始化。
这至少是结构体和类的另一个区别。这种初始化可能不是好的OO实践,但它在我支持的遗留WinSDK c++代码中随处可见。只是想让你知道…
其他回答
是的。结构就像一个类,但在类定义和继承时默认为public::
struct Foo
{
int bar;
Foo(void) :
bar(0)
{
}
}
考虑到你的另一个问题,我建议你阅读一些教程。他们会比我们更快更全面地回答你的问题。
是的,在结构中有构造函数是可能的,这里有一个例子:
#include<iostream.h>
struct a {
int x;
a(){x=100;}
};
int main() {
struct a a1;
getch();
}
以上所有答案都严格地回答了提问者的问题,但我只是想指出一个可能会遇到问题的情况。
如果你像这样声明你的结构体:
typedef struct{
int x;
foo(){};
} foo;
在尝试声明构造函数时会遇到问题。当然,这是因为你实际上并没有声明一个名为“foo”的结构体,你创建了一个匿名结构体,并给它分配了别名“foo”。这也意味着你不能在cpp文件中使用"foo"和作用域操作符:
foo。:
typedef struct{
int x;
void myFunc(int y);
} foo;
foo.cpp:
//<-- This will not work because the struct "foo" was never declared.
void foo::myFunc(int y)
{
//do something...
}
要解决这个问题,你必须这样做:
struct foo{
int x;
foo(){};
};
或:
typedef struct foo{
int x;
foo(){};
} foo;
后者创建了一个名为“foo”的结构体,并赋予其别名“foo”,因此在引用它时不必使用struct关键字。
在c++中,类和结构之间的唯一区别是,成员和基类在类中默认是私有的,而在结构中默认是公共的。
struct可以有构造函数,语法和类一样。
在c++中,struct和class都是相等的,除了struct的默认成员访问说明符是public和class有private。
在c++中使用struct的原因是c++是C的超集,必须向后兼容遗留的C类型。
例如,如果语言用户试图在他的c++代码中包含一些C头文件legacy-c.h,它包含struct Test {int x,y};struct Test的成员应该像C一样可以访问。