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

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

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

【问题讨论】:

    标签: c++ struct constructor


    【解决方案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 它是构造函数的主体。在这种情况下,我们不想在构造函数中运行任何代码,所以它是空的。
                    猜你喜欢
                    • 1970-01-01
                    • 2012-02-27
                    • 2017-07-25
                    • 2015-09-12
                    • 1970-01-01
                    • 2012-03-08
                    • 2017-06-10
                    • 2017-10-02
                    • 1970-01-01
                    相关资源
                    最近更新 更多