struct
可以在C ++中使用构造函数吗?
我一直试图解决这个问题,但我没有得到语法。
答案 0 :(得分:420)
在C ++中,class
和struct
之间的唯一区别是成员和基类在类中默认是私有的,而默认情况下它们在结构中是公共的。
所以结构体可以有构造函数,语法与类相同。
答案 1 :(得分:140)
struct TestStruct {
int id;
TestStruct() : id(42)
{
}
};
答案 2 :(得分:33)
是的,但如果你的结构是联盟,那么你就不能。它与班级相同。
struct Example
{
unsigned int mTest;
Example()
{
}
};
联盟不允许结构中的构造函数。您可以在联合上创建构造函数。 This question relates to non-trivial constructors in unions.
答案 3 :(得分:33)
以上所有答案在技术上都回答了提问者的问题,但我想我会指出一个可能遇到问题的案例。
如果你声明你的结构:
typedef struct{
int x;
foo(){};
} foo;
尝试声明构造函数时会遇到问题。这当然是因为您实际上没有声明一个名为“foo”的结构,您已经创建了一个匿名结构并为其指定了别名“foo”。这也意味着您将无法在cpp文件中使用“foo”和作用域操作符:
foo.h中:
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
关键字。
答案 4 :(得分:14)
是。结构就像一个类,但默认为public:
,在类定义和继承时:
struct Foo
{
int bar;
Foo(void) :
bar(0)
{
}
}
考虑到您的其他问题,我建议您仔细阅读some tutorials。他们会比我们更快,更完整地回答您的问题。
答案 5 :(得分:12)
struct HaveSome
{
int fun;
HaveSome()
{
fun = 69;
}
};
我宁愿在构造函数内部初始化,所以我不需要保持顺序。
答案 6 :(得分:11)
是C ++中的结构和类是相同的,除了结构成员默认是公共的,而类成员默认是私有的。你可以在一个结构中做的任何事情。
struct Foo
{
Foo()
{
// Initialize Foo
}
};
答案 7 :(得分:11)
答案 8 :(得分:10)
请注意,有一个有趣的区别(至少使用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' : Types with user defined constructors are not aggregate <file and line> : error C2552: '_pointList' : non-aggregates cannot be initialized with initializer list.
这至少是结构和类之间的另一个区别。这种初始化可能不是很好的OO实践,但它在我支持的传统WinSDK c ++代码中出现。只是你知道......
答案 9 :(得分:9)
在 c ++ struct 和 c ++ class 中,默认情况下只有一个区别,结构成员是公共成员,而成员是私有成员。
file2.txt
答案 10 :(得分:5)
是的,结构中的构造函数可以是一个例子:
#include<iostream.h>
struct a {
int x;
a(){x=100;}
};
int main() {
struct a a1;
getch();
}
答案 11 :(得分:5)
在C ++中struct
&amp; class
是相同的,除了struct's
默认成员访问说明符是public
&amp; class有private
。
在C ++中使用struct
的原因是C ++是C的超集,必须向后兼容legacy C types
。
例如,如果语言用户试图在他的C ++代码中包含一些C头文件legacy-c.h
。它包含struct Test {int x,y};
。 {C}}的成员应该像C一样可以访问。
答案 12 :(得分:5)
语法与C ++中的类相同。如果您知道在c ++中创建构造函数,那么它在struct中是相同的。
struct Date
{
int day;
Date(int d)
{
day = d;
}
void printDay()
{
cout << "day " << day << endl;
}
};
struct可以在c ++中将所有内容都作为类。如前所述差异仅在于默认情况下C ++成员具有私有访问权限但在结构中它是public.But根据编程考虑使用struct关键字用于仅数据结构。对具有数据和函数的对象使用class关键字。
答案 13 :(得分:2)
另一个示例,但在构造函数中设置值时使用 this 关键字:
#include <iostream>
using namespace std;
struct Node {
int value;
Node(int value) {
this->value = value;
}
void print()
{
cout << this->value << endl;
}
};
int main() {
Node n = Node(10);
n.print();
return 0;
}
与GCC 8.1.0一起编译。
答案 14 :(得分:1)
在C ++中,我们可以像类一样声明/定义结构,并为结构提供构造函数/析构函数,并在其中定义变量/函数。 唯一的区别是定义的变量/函数的默认范围。 除了上述差异之外,大多数情况下你应该能够使用结构来模仿类的功能。