Структурный конструктор в С++?

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

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

Ответ 1

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

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

Ответ 2

struct TestStruct {
        int id;
        TestStruct() : id(42)
        {
        }
};

Ответ 3

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

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

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

Ответ 4

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

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

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

У вас возникнут проблемы с попыткой объявить конструктор. Это, конечно, потому, что вы на самом деле не объявили структуру с именем "foo" , вы создали анонимную структуру и присвоили ей псевдоним "foo" . Это также означает, что вы не сможете использовать "foo" с оператором scoping в файле 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 при его ссылке.

Ответ 5

Как упоминают другие ответы, структура в основном рассматривается как класс в С++. Это позволяет иметь конструктор, который можно использовать для инициализации структуры со значениями по умолчанию. Ниже конструктор принимает 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);

Ответ 6

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

struct Foo
{
    int bar;

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

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

Ответ 7

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

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

Ответ 8

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

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

Ответ 9

Обратите внимание, что есть одно интересное различие (по крайней мере, с компилятором MS С++):


Если у вас есть простая структура ванили, такая

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 С++, который я поддерживаю. Просто чтобы вы знали...

Ответ 10

В С++ struct и классе С++ есть только одно различие по умолчанию, члены структуры являются общедоступными, а члены класса являются закрытыми.

/*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;
}

Ответ 11

Да, возможно, что конструктор в структуре здесь один пример:

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

int main() {
  struct a a1;
  getch();
}

Ответ 12

В С++ оба struct и class равны, кроме struct's спецификатор доступа к члену по умолчанию - public, а класс имеет private.

Причиной наличия struct в С++ является С++ - это надмножество C и должно иметь обратную совместимость с legacy C types.

Например, если пользователь языка пытается включить некоторый файл заголовка C legacy-c.h в свой код на С++ и содержит struct Test {int x,y};. Члены struct Test должны быть доступны как C.

Ответ 13

В С++ мы можем объявить/определить структуру точно так же, как класс, и иметь конструкторы/деструкторы для Структур и иметь в ней переменные/функции. Единственное различие - это диапазон по умолчанию для переменных/функций. Помимо вышеуказанной разницы, в основном вы должны быть способны имитировать функциональность класса с помощью структур.

Ответ 14

Синтаксис такой же, как и для класса на С++. Если вы знаете о создании конструктора в С++, то он одинаковый в struct.

struct Date
{
int day;

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

};

Struct может иметь все вещи как класс в С++. Как ранее говорилось, разница заключается только в том, что по умолчанию член С++ имеет закрытый доступ, но в структуре он является общедоступным. Но в соответствии с рассмотрением программирования Используйте ключевое слово struct для структур только для данных. Используйте ключевое слово класса для объектов, у которых есть как данные, так и функции.