C ++中的Struct构造函数?

时间:2009-07-14 19:12:10

标签: c++ struct constructor

struct可以在C ++中使用构造函数吗?

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

15 个答案:

答案 0 :(得分:420)

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

所以结构体可以有构造函数,语法与类相同。

答案 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)

下表简要描述了类,结构和联合。

enter image description here

答案 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 ++中,我们可以像类一样声明/定义结构,并为结构提供构造函数/析构函数,并在其中定义变量/函数。 唯一的区别是定义的变量/函数的默认范围。 除了上述差异之外,大多数情况下你应该能够使用结构来模仿类的功能。