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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Да, только разработчики компилеров иногда об этом забывают... 02.03.05 04:47  Число просмотров: 1813
Автор: void <Grebnev Valery> Статус: Elderman
<"чистая" ссылка>
> Стандарт говорит,
> что семантически struct и class совершенно идентичны, за
> исключением дефолтовой видимости членов

template <struct T>
T func ( T val ) { return (val * val); }

Не компилируется. Здесь class поменяли на struct.

ПС. Такой вопрос может быть на интервью, при поиске работы.
<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 перегружено как минимум пятью разными значениями и ничего - работает :-).

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




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


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