Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
| | | | | | |
Да 01.03.05 16:06 Число просмотров: 2093
Автор: amirul <Serge> Статус: The Elderman
|
> > Ну дык, в union-ах тоже работает перегрузка > операторов, > > конструкторы/деструкторы (кажется даже виртуальные > функции > > можно запихнуть).
> Например, можно ли создать веткор для "класса" (шо > описывается struct), с описанием деструктора и > конструкторов, включая конструктор копирования. Допускает > ли вообще использование struct включение деструктора. Это в C++ допускает даже union.
struct TestStruct;
class TestStructPointer {
private:
class TestStruct *ptr;
public:
TestStructPointer() {}
~TestStructPointer() {}
};
void
main() {
TestStructPointer a;
}
---
Выдает ворнинг, но отлично компилирует. Стандарт говорит, что семантически struct и class совершенно идентичны, за исключением дефолтовой видимости членов
|
<programming>
|
[C++] struct C++ 01.03.05 06:43
Автор: void <Grebnev Valery> Статус: Elderman
|
... чем отличается от class, кроме того, что по умолчанию мемберы в одном случае паблик, а в другом приват. Если только в этом и вся разница, то почему ж тогда не использовать везде и всюду struct?
Приведите примеры, когда задачу можно решить только при помощи объявлений class.
ПС. Сам никогда даже не задумывался про это. :)))
|
|
struct - наследие обычного C: поддерживается, но считается... 01.03.05 10:14
Автор: ukv Статус: Незарегистрированный пользователь
|
> ... чем отличается от class, кроме того, что по умолчанию > мемберы в одном случае паблик, а в другом приват. Если > только в этом и вся разница, то почему ж тогда не > использовать везде и всюду struct? > > Приведите примеры, когда задачу можно решить только при > помощи объявлений class. > > ПС. Сам никогда даже не задумывался про это. :)))
struct - наследие обычного C: поддерживается, но считается устаревшим. Человек, всюду в новых проектах на C++ применяющий struct вместо class - скорее всего, неверно выбрал язык программирования (когда объектно-ориентированная модель не нужна и вполне достаточно обычного C), или не понимает одного из базовых принципов ООП (публичные интерфейсы и скрытие всего остального).
|
| |
Добавлю, что struct чаще всего используется просто для того, чтобы подчеркнуть 01.03.05 11:51
Автор: amirul <Serge> Статус: The Elderman
|
Что это просто набор данных. И чаще всего для совместимости со старым кодом (например для совместимости с WinAPI)
> > ... чем отличается от class, кроме того, что по > умолчанию > > мемберы в одном случае паблик, а в другом приват. Если Более того, они только ПО УМОЛЧАНИЮ паблик и приват. В большинстве случаев даже при объявлении класса принято сразу же ставить ключевые слова public или private.
> > только в этом и вся разница, то почему ж тогда не > > использовать везде и всюду struct? Здесь дело только в названии, ИМХО. Слово class подчеркивает что это отдельный ТИП данных. А struct - просто набор каких либо базовых.
|
| | |
И еще одна хитрость 01.03.05 12:04
Автор: leo <Леонид Юрьев> Статус: Elderman
|
Для многих компиляторов (в частности для gcc 3) объявления 'extern "C" struct {' и 'class { public:' - две разные вещи. Компилятор может по-разному геренировать код при управлении экземплярами этих типов. Например 'struct' возвращаемый из функции будет по-возможности втиснут в регистры, а 'class' с легкостью записан по адресу (возможно на стеке) сформированному вызывающей функцией.
|
| | | |
[C++] Всё же о стандарте С++ я пытаюсь понять ;)) 01.03.05 14:50
Автор: void <Grebnev Valery> Статус: Elderman
|
> Для многих компиляторов (в частности для gcc 3) объявления > 'extern "C" struct {' и 'class { public:' - две разные > вещи. Компилятор может по-разному геренировать код при > управлении экземплярами этих типов. Например 'struct' > возвращаемый из функции будет по-возможности втиснут в > регистры, а 'class' с легкостью записан по адресу (возможно > на стеке) сформированному вызывающей функцией.
Вот это уже ближе... Кстати, а почему? Весьма интересно.
Но меня больше заинтересовала сторонастандартаС++. Парадокс в том, что практически, в несложном коде всё можно сделать со struct. Работает всё, включая акссесоры.
ПС. Не уверен про STL
|
| | | | |
[C++] Стандарт говорит о том что struct и class совершенно идентичны 01.03.05 15:07
Автор: amirul <Serge> Статус: The Elderman
|
> Вот это уже ближе... Кстати, а почему? Весьма интересно. > Но меня больше заинтересовала сторонастандартаС++.
За исключением дефолтового сокрытия для членов.
> Парадокс в том, что практически, в несложном коде всё можно > сделать со struct. Работает всё, включая акссесоры.
Ну дык, в union-ах тоже работает перегрузка операторов, конструкторы/деструкторы (кажется даже виртуальные функции можно запихнуть).
> ПС. Не уверен про STL Э-э-э. В чем именно не уверен?
|
| | | | | |
Например, можно ли создать веткор для "класса" (шо... 01.03.05 15:22
Автор: void <Grebnev Valery> Статус: Elderman
|
> > Вот это уже ближе... Кстати, а почему? Весьма > интересно. > > Но меня больше заинтересовала сторонастандартаС++. > > За исключением дефолтового сокрытия для членов. > > > Парадокс в том, что практически, в несложном коде всё > можно > > сделать со struct. Работает всё, включая акссесоры. > > Ну дык, в union-ах тоже работает перегрузка операторов, > конструкторы/деструкторы (кажется даже виртуальные функции > можно запихнуть). > > > ПС. Не уверен про STL > Э-э-э. В чем именно не уверен?
Например, можно ли создать веткор для "класса" (шо описывается struct), с описанием деструктора и конструкторов, включая конструктор копирования. Допускает ли вообще использование struct включение деструктора.
|
| | | | | | |
Да 01.03.05 16:06
Автор: amirul <Serge> Статус: The Elderman
|
> > Ну дык, в union-ах тоже работает перегрузка > операторов, > > конструкторы/деструкторы (кажется даже виртуальные > функции > > можно запихнуть).
> Например, можно ли создать веткор для "класса" (шо > описывается struct), с описанием деструктора и > конструкторов, включая конструктор копирования. Допускает > ли вообще использование struct включение деструктора. Это в C++ допускает даже union.
struct TestStruct;
class TestStructPointer {
private:
class TestStruct *ptr;
public:
TestStructPointer() {}
~TestStructPointer() {}
};
void
main() {
TestStructPointer a;
}
---
Выдает ворнинг, но отлично компилирует. Стандарт говорит, что семантически struct и class совершенно идентичны, за исключением дефолтовой видимости членов
|
| | | | | | | |
Да, только разработчики компилеров иногда об этом забывают... 02.03.05 04:47
Автор: void <Grebnev Valery> Статус: Elderman
|
> Стандарт говорит, > что семантически struct и class совершенно идентичны, за > исключением дефолтовой видимости членов
template <struct T>
T func ( T val ) { return (val * val); }
Не компилируется. Здесь class поменяли на struct.
ПС. Такой вопрос может быть на интервью, при поиске работы.
|
| | | | | | | | |
Ну темлейты это вообще отдельный разговор 02.03.05 11:56
Автор: amirul <Serge> Статус: The Elderman
|
> template < struct T > > T func ( T val ) { return (val * val); } > > Не компилируется. Здесь class поменяли на struct.
Просто здесь недопустимо использование struct (можно только class и typename, которые в этом контексте взаимозаменямы).
С другой стороны, даже если в аргументах темплейта написано class, это не значит, что при инстанцировании нужно указывать именно класс. Пример:
template <class T>
void call_functor(T functor) {
functor();
}
class some_functor {
public:
void operator() () {}
};
void some_function() {
}
void
main() {
call_functor(some_functor());
call_functor(some_function);
call_functor(&some_function);
}
---
В первом вызове действительно создается функтор. Но остальные вызовы показывают, что можно использовать ЛЮБОЙ объект к которому применим оператор (). В том числе и функцию и указатель на функцию.
Короче, в списке аргументов шаблона используется не то слово class, которое используется для задания структуры (в терминах C++ - оно перегружено - overloaded). Например ключевое слово static перегружено как минимум пятью разными значениями и ничего - работает :-).
> ПС. Такой вопрос может быть на интервью, при поиске работы. Успехов на собеседовании
|
|
|