информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаSpanning Tree Protocol: недокументированное применениеПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
 Умер Никлаус Вирт 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[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 перегружено как минимум пятью разными значениями и ничего - работает :-).

> ПС. Такой вопрос может быть на интервью, при поиске работы.
Успехов на собеседовании
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach