Вопрос по struct, constructor, c++ – Конструктор Struct в C ++?

306

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

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

Ваш Ответ

15   ответов
5

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

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

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

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

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

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

14

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

struct Foo
{
    int bar;

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

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

10

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

прекрасно работает с последними битами в VS 2017 Preview 4. API версия 141
Это похоже на некорректное поведение компилятора (при условииclass версия объявляет своих членов какpublic). МС говорит"Visual C++ does not allow data types in an aggregate that contains constructors", но не указывает, почему это не относится и к классам. И похоже на работу в VS 2015.
Итак, Алуан, вы говорите, что VS2017 теперь разрешает список инициализаторов для структур с конструкторами? Я еще не пробовал предварительный просмотр ... Спасибо!
32

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

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

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

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

как насчет того, когда: typedef struct foo {int x; foo (int x) {}; } Foo; foo :: foo (int x) {...}; это не работает...
1

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

9

Вc++ struct а такжеc++ class есть только одно отличие по умолчанию члены структуры являются открытыми, а члены класса являются частными.

/*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;
}
12
struct HaveSome
{
   int fun;
   HaveSome()
   {
      fun = 69;
   }
};

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

Члены всегда инициализируются в том порядке, в котором они появляются в теле класса / структуры. Создание назначений в теле конструктора - это просто ... назначения.
5

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

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

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

8

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

enter image description here

413

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

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

И эти структуры будут по умолчанию открытыми при выводе из :)
@Chap: Если у него есть конкретные проблемы, когда общее решение не работает, вероятно, будет лучшей идеей опубликовать некоторый код, показывающий проблему и сгенерированные ошибки компилятора. Но в целом, когда задают вопрос, я не думаю, что можно на самом деле сделать слишком много выводов о конкретной проблеме, которую ОП пытается решить ...
@BenVoigt: Вау. Как вы нашли этот старый комментарий? :) Хотелось бы, чтобы я мог отредактировать это ... даже я запутался в том, что написал. Я думаю, что пропустил слово «основы» с конца, но даже это отстой.
@GMan: Правильная идея, неправильная формулировка.struct по умолчанию наследует свои базовые классы публично; нет никаких изменений в классах, происходящих изstruct.
@sth Ваше право на разницу между struct и class, однако я думаю, что у него проблема с компиляцией. Проблема может быть из-за объединения, которое использует структуру. Вы не можете иметь нетривиальных конструкторов того типа, который есть в объединении.
11

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

struct Foo
{
  Foo()
  {
    // Initialize Foo
  }
};
Тип вещи, созданный по ключевому словуstruct is a class.
3

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

struct Date
{
int day;

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

};

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

136
struct TestStruct {
        int id;
        TestStruct() : id(42)
        {
        }
};
Что: id(42) часть называется?
@ user13107: & quot;initializer list& Quot; это слово, которое вы ищете.
@ user152949: Никто не сказал, что будет. Мы все могли бы прокомментировать все выдержки из кода, сказав, что «это не сработает, если [какой-то совершенно другой сценарий]», но какой в этом смысл?
Это не сработает, если вы наследуете другой класс, а переменная объявлена в родительском классе.
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.

Похожие вопросы