C ++中的结构构造函数?

Posted

技术标签:

【中文标题】C ++中的结构构造函数?【英文标题】:Struct Constructor in C++? 【发布时间】:2010-11-10 18:35:27 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

正如其他答案所提到的,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);

【讨论】:

不仅仅是“基本上被视为”......关键字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-&gt;赋值【参考方案5】:

c++ structc++ 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++ 中,classstruct 之间的唯一区别是成员和基类在类中默认为私有,而在结构中默认为公共。

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

【讨论】:

当从 :) 派生时结构将默认为 public @sth 你对结构和类之间的区别是正确的,但是我认为他有一个编译问题。问题可能是因为使用该结构的联合。联合中的类型不能有非平凡的构造函数。 @Chap:如果他有一般解决方案不起作用的具体问题,最好发布一些显示问题和生成的编译器错误的代码。但是,正如提出的问题一般,我认为人们无法真正推断出 OP 试图解决的具体问题...... @GMan:正确的想法,错误的措辞。 struct 默认公开继承其基类;从struct 派生的类没有变化。 @BenVoigt:哇。你是怎么找到这个旧评论的。 :) 是的,希望我可以编辑它……即使我对自己写的内容感到困惑。我想我从最后省略了“基地”这个词,但即使这样也很糟糕。【参考方案7】:

在 C++ 中,structclass 都相等,除了 struct'sdefault 成员访问说明符是 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 ++中的结构构造函数?的主要内容,如果未能解决你的问题,请参考以下文章

c语言如何对结构体某一成员初始化

使用c中的指针初始化结构的构造函数值[重复]

可克隆层次结构中的C ++副本构造函数和赋值

c++ 当我创建结构数组时,如何使用结构数组内的类的参数调用构造函数?

JS构造函数加new与不加new的区别?

C语言里面构造函数和析构函数的运用办法