Struct构造函数在c++ ?

struct在c++中可以有构造函数吗?

我一直试图解决这个问题,但我没有得到语法。

782796 次浏览
struct TestStruct {
int id;
TestStruct() : id(42)
{
}
};

在c++中,classstruct之间的唯一区别是,成员和基类在类中默认是私有的,而在结构中默认是公共的。

struct可以有构造函数,语法和类一样。

是的。结构就像类一样,但在类定义和继承时默认为public::

struct Foo
{
int bar;


Foo(void) :
bar(0)
{
}
}

考虑到你的另一个问题,我建议你阅读一些教程。他们会比我们更快更全面地回答你的问题。

是的,c++中的结构和类是相同的,除了结构成员默认是公共的,而类成员默认是私有的。在类中可以做的任何事情,在结构中也应该可以做。

struct Foo
{
Foo()
{
// Initialize Foo
}
};

是的,但是如果你在工会中有你的结构,那么你就不能。它和类是一样的。

struct Example
{
unsigned int mTest;
Example()
{
}
};

工会将不允许在结构中使用构造函数。你可以在联合上创建一个构造函数。这个问题与联合中的非平凡构造函数有关。

在c++中,我们可以像类一样声明/定义结构,并拥有结构的构造函数/析构函数,并在其中定义变量/函数。 唯一的区别是定义的变量/函数的默认作用域。 除了上面的不同,大多数情况下你应该能够使用结构来模仿类的功能
struct HaveSome
{
int fun;
HaveSome()
{
fun = 69;
}
};

我宁愿在构造函数中初始化,这样就不需要保持顺序。

是的,在结构中有构造函数是可能的,这里有一个例子:

#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关键字。

正如其他答案所提到的,struct在c++中基本上被视为class。这允许你有一个构造函数,可以用默认值初始化struct。下面,构造函数将szb作为参数,并将其他变量初始化为一些默认值。

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);

在c++中struct和amp;class是相等的,除了__abc2默认成员访问说明符是public &类有private

在c++中使用struct的原因是c++是C的超集,必须向后兼容legacy C types

例如,如果语言用户试图在他的c++代码中包含一些C头文件legacy-c.h &它包含struct Test {int x,y};struct Test的成员应该像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' : 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++代码中随处可见。只是想让你知道…

c++结构c++类中只有一个区别,默认结构成员是public,类成员是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;
}

语法与c++中的类是一样的。如果你知道在c++中创建构造函数,那么在struct中也是一样的。

struct Date
{
int day;


Date(int d)
{
day = d;
}


void printDay()
{
cout << "day " << day << endl;
}
};

Struct在c++中可以把所有东西都作为类。如前所述,区别只是默认情况下c++成员具有私有访问权限,但在结构中它是公共访问权限。但是根据编程考虑,对于仅数据结构使用struct关键字。对于同时具有数据和函数的对象使用class关键字。

再举一个在构造函数中设置值时使用关键字的例子:

#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编译。

类、结构和联合在下表中简要描述。

enter image description here