C ++中的结构构造函数?
Posted
技术标签:
【中文标题】C ++中的结构构造函数?【英文标题】:Struct Constructor in C++? 【发布时间】:2010-11-10 18:35:27 【问题描述】:struct
可以在 C++ 中有构造函数吗?
我一直在尝试解决这个问题,但我没有得到语法。
【问题讨论】:
【参考方案1】:正如其他答案所提到的,struct
在 C++ 中基本上被视为class
。这允许您拥有一个构造函数,该构造函数可用于使用默认值初始化 struct
。下面,构造函数将sz
和b
作为参数,并将其他变量初始化为一些默认值。
struct blocknode
unsigned int bsize;
bool free;
unsigned char *bptr;
blocknode *next;
blocknode *prev;
blocknode(unsigned int sz, unsigned char *b, bool f = true,
blocknode *p = 0, blocknode *n = 0) :
bsize(sz), free(f), bptr(b), prev(p), next(n)
;
用法:
unsigned char *bptr = new unsigned char[1024];
blocknode *fblock = new blocknode(1024, btpr);
【讨论】:
不仅仅是“基本上被视为”......关键字struct
字面上创建了一个类。期间。【参考方案2】:
语法与 C++ 中的类相同。如果您知道在 c++ 中创建构造函数,那么它在 struct 中是相同的。
struct Date
int day;
Date(int d)
day = d;
void printDay()
cout << "day " << day << endl;
;
Struct 可以将所有东西都作为 C++ 中的类。如前所述,区别仅在于默认情况下 C++ 成员具有私有访问权限,但在结构中它是公共的。但是根据编程考虑,将 struct 关键字用于纯数据结构。对同时具有数据和函数的对象使用 class 关键字。
【讨论】:
【参考方案3】:类、结构和联合简述如下表。
【讨论】:
【参考方案4】:还有一个例子,但在构造函数中设置值时使用 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 编译。
【讨论】:
你应该考虑使用“初始化列表”而不是this->
赋值【参考方案5】:
c++ struct和c++ class只有一个区别,默认struct成员是public,class成员是private。
/*Here, C++ program constructor in struct*/
#include <iostream>
using namespace std;
struct hello
public: //by default also it is public
hello();
~hello();
;
hello::hello()
cout<<"calling constructor...!"<<endl;
hello::~hello()
cout<<"calling destructor...!"<<endl;
int main()
hello obj; //creating a hello obj, calling hello constructor and destructor
return 0;
【讨论】:
【参考方案6】:在 C++ 中,class
和 struct
之间的唯一区别是成员和基类在类中默认为私有,而在结构中默认为公共。
所以结构可以有构造函数,语法和类一样。
【讨论】:
当从 :) 派生时结构将默认为 public @sth 你对结构和类之间的区别是正确的,但是我认为他有一个编译问题。问题可能是因为使用该结构的联合。联合中的类型不能有非平凡的构造函数。 @Chap:如果他有一般解决方案不起作用的具体问题,最好发布一些显示问题和生成的编译器错误的代码。但是,正如提出的问题一般,我认为人们无法真正推断出 OP 试图解决的具体问题...... @GMan:正确的想法,错误的措辞。struct
默认公开继承其基类;从struct
派生的类没有变化。
@BenVoigt:哇。你是怎么找到这个旧评论的。 :) 是的,希望我可以编辑它……即使我对自己写的内容感到困惑。我想我从最后省略了“基地”这个词,但即使这样也很糟糕。【参考方案7】:
在 C++ 中,struct
和 class
都相等,除了 struct's
default 成员访问说明符是 public
和类有 private
。
在 C++ 中使用 struct
的原因是 C++ 是 C 的超集,必须向后兼容 legacy C types
。
例如,如果语言用户试图在他的 C++ 代码中包含一些 C 头文件 legacy-c.h
并且它包含 struct Test int x,y;
。 struct Test
的成员应该可以像 C 一样访问。
【讨论】:
【参考方案8】:请注意,有一个有趣的区别(至少对于 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++ 代码中随处可见。只是让你知道...
【讨论】:
这似乎是编译器的错误行为(假设class
版本将其成员声明为public
)。 MS 说"Visual C++ does not allow data types in an aggregate that contains constructors",但没有说明为什么这也不适用于课程。它似乎在 VS 2015 中有效。
也适用于 VS 2017 Preview 4 中的最新位。 API 版本 141
那么 Aluan,你是说 VS2017 现在允许带有构造函数的结构的初始化列表吗?我还没有尝试预览...谢谢!【参考方案9】:
以上所有答案在技术上回答了提问者的问题,但我只是想指出一个您可能会遇到问题的案例。
如果你这样声明你的结构:
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
关键字。
【讨论】:
什么时候:typedef struct foo int x; foo(int x); 富; foo::foo(int x)...;这不起作用... 或者您可以定义:struct foo int x; foo(); ;
,然后:typedef struct foo foo;
【参考方案10】:
是的,结构中可能有构造函数,这是一个例子:
#include<iostream.h>
struct a
int x;
a()x=100;
;
int main()
struct a a1;
getch();
【讨论】:
【参考方案11】:struct HaveSome
int fun;
HaveSome()
fun = 69;
;
我宁愿在构造函数中初始化,这样我就不需要保持顺序了。
【讨论】:
成员总是按照它们在类/结构体中出现的顺序进行初始化。在构造函数体中创建赋值就是...赋值。【参考方案12】:在 C++ 中,我们可以像类一样声明/定义结构,并为结构提供构造函数/析构函数,并在其中定义变量/函数。 唯一的区别是定义的变量/函数的默认范围。 除了上面的区别之外,大多数情况下你应该能够使用结构来模仿类的功能。
【讨论】:
【参考方案13】:是的,但是如果您的结构在工会中,那么您就不能。和类一样。
struct Example
unsigned int mTest;
Example()
;
联合不允许在结构中使用构造函数。不过,您可以在联合上创建一个构造函数。 This question relates to non-trivial constructors in unions.
【讨论】:
【参考方案14】:是的,C++ 中的结构和类是相同的,只是结构成员默认是公共的,而类成员默认是私有的。你可以在类中做的任何事情,你都应该可以在结构中做。
struct Foo
Foo()
// Initialize Foo
;
【讨论】:
关键字struct
创建的那种东西是一个类。【参考方案15】:
是的。结构就像一个类,但在类定义和继承时默认为public:
:
struct Foo
int bar;
Foo(void) :
bar(0)
考虑到您的其他问题,我建议您通读some tutorials。他们会比我们更快、更完整地回答您的问题。
【讨论】:
【参考方案16】:struct TestStruct
int id;
TestStruct() : id(42)
;
【讨论】:
: id(42)
部分叫什么?
@user13107: "initializer list" 是您要查找的单词。
如果你从另一个类继承并且变量在父类中被清除,那将不起作用。
@user152949:没有人说会。我们都可以对所有代码摘录发表评论,说“如果 [一些完全不同的场景],这将不起作用”,但有什么意义呢?
@varungupta 它是构造函数的主体。在这种情况下,我们不想在构造函数中运行任何代码,所以它是空的。以上是关于C ++中的结构构造函数?的主要内容,如果未能解决你的问题,请参考以下文章