Конструктор Struct в C ++? - PullRequest
318 голосов
/ 14 июля 2009

Может ли struct иметь конструктор в C ++?

Я пытался решить эту проблему, но не получил синтаксис.

Ответы [ 16 ]

421 голосов
/ 14 июля 2009

В C ++ единственная разница между class и struct заключается в том, что члены и базовые классы являются закрытыми по умолчанию в классах, тогда как они являются открытыми по умолчанию в структурах.

Таким образом, структуры могут иметь конструкторы, и синтаксис такой же, как для классов.

143 голосов
/ 14 июля 2009
struct TestStruct {
        int id;
        TestStruct() : id(42)
        {
        }
};
35 голосов
/ 16 января 2013

Все вышеприведенные ответы технически отвечают на вопрос автора, но я просто подумал, что укажу случай, когда у вас могут возникнуть проблемы.

Если вы объявите свою структуру следующим образом:

typedef struct{
int x;
foo(){};
} foo;

У вас будут проблемы при попытке объявить конструктор. Это, конечно, потому что вы на самом деле не объявили структуру с именем "foo", вы создали анонимную структуру и присвоили ей псевдоним "foo". Это также означает, что вы не сможете использовать «foo» с оператором определения объема в файле cpp:

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 голосов
/ 14 июля 2009

Да, но если у вас есть структура в союзе, то вы не можете. Это так же, как класс.

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

Союзы не позволят конструкторам в структурах. Вы можете создать конструктор для объединения, хотя. Этот вопрос относится к нетривиальным конструкторам в объединениях.

28 голосов
/ 29 марта 2013

Как уже упоминалось в других ответах, структура в основном рассматривается как класс в C ++. Это позволяет вам иметь конструктор, который можно использовать для инициализации структуры со значениями по умолчанию. Ниже конструктор принимает sz и b в качестве аргументов и инициализирует другие переменные некоторыми значениями по умолчанию.

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);
14 голосов
/ 14 июля 2009

Да. Структура подобна классу, но по умолчанию public: в определении класса и при наследовании:

struct Foo
{
    int bar;

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

Учитывая ваш другой вопрос, я бы посоветовал вам прочитать некоторые учебники . Они ответят на ваши вопросы быстрее и полнее, чем мы.

12 голосов
/ 15 июля 2009
struct HaveSome
{
   int fun;
   HaveSome()
   {
      fun = 69;
   }
};

Я бы предпочел инициализировать внутри конструктора, чтобы мне не нужно было сохранять порядок.

11 голосов
/ 08 августа 2018

Класс, структура и объединение кратко описаны в таблице ниже.

enter image description here

11 голосов
/ 14 июля 2009

Да, структуры и классы в C ++ одинаковы, за исключением того, что члены структур по умолчанию являются открытыми, а члены классов по умолчанию являются закрытыми. Все, что вы можете делать в классе, вы должны делать в структуре.

struct Foo
{
  Foo()
  {
    // Initialize Foo
  }
};
10 голосов
/ 08 марта 2014

Обратите внимание, что есть одно интересное отличие (по крайней мере с компилятором 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.

Так что это как минимум еще одно различие между структурой и классом. Этот тип инициализации может не быть хорошей практикой ОО, но он встречается повсеместно в устаревшем коде WinSDK c ++, который я поддерживаю. Просто чтобы ты знал ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...