Конструктор Struct в C++?
Может struct
есть конструктор в C++?
Я пытался решить эту проблему, но я не получаю синтаксис.
17 ответов
В C++ единственная разница между class
и struct
состоит в том, что члены и базовые классы являются закрытыми по умолчанию в классах, тогда как они являются открытыми по умолчанию в структурах.
Таким образом, структуры могут иметь конструкторы, а синтаксис такой же, как и для классов.
Все вышеприведенные ответы технически отвечают на вопрос автора, но я подумал, что укажу случай, когда у вас могут возникнуть проблемы.
Если вы объявите свою структуру следующим образом:
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
ключевое слово при ссылке на него.
Как упоминают другие ответы, структура в основном рассматривается как класс в 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);
Да, но если у вас есть структура в профсоюзе, вы не можете. Это так же, как класс.
struct Example
{
unsigned int mTest;
Example()
{
}
};
Союзы не позволят конструкторам в структурах. Вы можете создать конструктор для объединения, хотя. Этот вопрос относится к нетривиальным конструкторам в объединениях.
В 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;
}
Синтаксис такой же, как у класса в C++. Если вы знаете о создании конструктора в C++, то он такой же в структуре.
struct Date
{
int day;
Date(int d)
{
day = d;
}
void printDay()
{
cout << "day " << day << endl;
}
};
Struct может иметь все как класс в C++. Как упоминалось ранее, отличие состоит только в том, что по умолчанию член C++ имеет частный доступ, но в структуре он является общедоступным. Но согласно соображениям программирования используйте ключевое слово struct для структур, содержащих только данные. Используйте ключевое слово class для объектов, которые имеют как данные, так и функции.
Еще один пример, но с использованием этого ключевого слова при установке значения в конструкторе:
#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.
Да. Структура похожа на класс, но по умолчанию public:
в определении класса и при наследовании:
struct Foo
{
int bar;
Foo(void) :
bar(0)
{
}
}
Учитывая ваш другой вопрос, я бы посоветовал вам прочитать несколько уроков. Они ответят на ваши вопросы быстрее и полнее, чем мы.
Обратите внимание, что есть одно интересное отличие (по крайней мере с компилятором 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++, который я поддерживаю. Просто чтобы ты знал...
struct HaveSome
{
int fun;
HaveSome()
{
fun = 69;
}
};
Я бы предпочел инициализировать внутри конструктора, поэтому мне не нужно сохранять порядок.
Да, структуры и классы в C++ одинаковы, за исключением того, что члены структур по умолчанию являются открытыми, тогда как члены классов по умолчанию являются закрытыми. Все, что вы можете делать в классе, вы должны делать в структуре.
struct Foo
{
Foo()
{
// Initialize Foo
}
};
В C++ оба struct
& class
равны кроме struct's
спецификатор доступа к члену по умолчанию public
& класс имеет private
,
Причина того, что struct
в C++ C++ является надмножеством C и должен иметь обратную совместимость с legacy C types
,
Например, если пользователь языка пытается включить заголовочный файл C legacy-c.h
в своем коде C++, и он содержит struct Test {int x,y};
, Члены struct Test
должен быть доступен как C.
Да, возможно иметь конструктор в структуре вот один пример:
#include<iostream.h>
struct a {
int x;
a(){x=100;}
};
int main() {
struct a a1;
getch();
}
В C++ мы можем объявлять / определять структуру точно так же, как класс и иметь конструкторы / деструкторы для Структур и иметь определенные переменные / функции. Единственным отличием является область действия по умолчанию для определенных переменных / функций. Помимо вышеупомянутой разницы, в основном вы должны быть в состоянии имитировать функциональность класса, используя структуры.
Если вы хотите, вместо использования конструктора вы можете использовать инициализатор структуры . Есть несколько способов сделать это...
См.: Как инициализировать структуру в соответствии со стандартами языка программирования C.
Это «стиль C» старой школы, то есть не «стиль C++» новой школы, но, конечно, он работает и на C++.