web-dev-qa-db-ja.com

C + +の構造体コンストラクタ?

structはC++でコンストラクタを持つことができますか?

私はこの問題を解決しようとしていますが、構文がわかりません。

316
Jay

C++では、classstructの唯一の違いは、メンバと基本クラスは、デフォルトではクラス内ではプライベートであるのに対し、構造体ではデフォルトでパブリックであることです。

そのため、構造体はコンストラクタを持つことができ、その構文はクラスの場合と同じです。

420
sth
struct TestStruct {
        int id;
        TestStruct() : id(42)
        {
        }
};
139
nos

上記のすべての回答は、技術的に質問者の質問に答えるものですが、問題が発生する可能性がある場合を指摘しておきます。

あなたがこのようにあなたの構造体を宣言するならば:

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キーワードを使用する必要はありません。

33
gitarooLegend

はい、しかしあなたがあなたの構造が労働組合の中にあるなら、あなたはできません。クラスと同じです。

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

共用体は、構造体の中でコンストラクタを許可しません。あなたは結束のコンストラクタを作ることができます。 この質問は労働組合の自明でない構成者に関係しています。

33
Chap

他の答えが述べているように、構造体は基本的にC++のクラスとして扱われます。これにより、構造体をデフォルト値で初期化するために使用できるコンストラクタを持つことができます。以下では、コンストラクターは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);
27
Luqmaan

はい。構造体はクラスに似ていますが、クラス定義および継承時のデフォルトはpublic:です。

struct Foo
{
    int bar;

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

あなたの他の質問を考えて、私はあなたが いくつかのチュートリアルを読むことを勧めます 。彼らは私達がするより速くそしてより完全にあなたの質問に答えるでしょう。

14
GManNickG
struct HaveSome
{
   int fun;
   HaveSome()
   {
      fun = 69;
   }
};

私はむしろコンストラクタの中で初期化したいので、順番を守る必要はありません。

12
SwDevMan81

C++の構造体とクラスは同じですが、構造体のメンバはデフォルトでパブリックであるのに対し、クラスのメンバはデフォルトでプライベートです。クラスでできることはすべて、構造体でできることです。

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

興味深い違いが1つあります(少なくとも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 ++コードのいたるところに見られます。ちょうどあなたが知っているので...

10
Steve L

クラス、構造および連合は、以下の表に略記されています。

enter image description here

10
Saurabh Raoot

c ++ struct c ++ class では、デフォルトではstructメンバーは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;
}
9
Kulamani

はい、ここではコンストラクタを構造化することが可能です。

#include<iostream.h> 
struct a {
  int x;
  a(){x=100;}
};

int main() {
  struct a a1;
  getch();
}
5
Rajesh Thakur

構文はC++のクラスと同じです。 c ++でコンストラクタを作成することを知っているのなら、それはstructでも同じです。

struct Date
{
int day;

Date(int d)
{
    day = d;
}
void printDay()
{
    cout << "day " << day << endl;
}

};

Structは、すべてのものをc ++のクラスとして持つことができます。前述したように、違いはデフォルトではC++メンバがプライベートアクセス権を持っているということだけですが、それはpublicです。プログラミング上の考慮によりデータのみの構造体にはstructキーワードを使用してください。データと機能の両方を持つオブジェクトにはclassキーワードを使用してください。

5
sitaram chhimpa

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のようにアクセス可能であるべきです。

5

もう1つの例ですが、コンストラクタで値を設定するときに 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でコンパイルされています。

2
Luka Lopusina

C++では、クラスと同じように構造体を宣言/定義し、構造体のコンストラクタ/デストラクタを持ち、その中に変数/関数を定義することができます。唯一の違いは、定義されている変数/関数のデフォルトの有効範囲です。上記の違い以外は、ほとんどの場合、構造体を使用してクラスの機能を模倣できるはずです。

1
Roopesh Majeti