KpeHDeJIb
1. Могу только догадываться что такое "в начале"
2. GCC передает this на стеке (как cdecl, причем - последним параметром), MSVC - в регистре ECX.
Ghost2
В начале это значит перед остальными аргументами в порядке размещения данным компилятором аргументов при передаче в функцию.
Более-менее открытием была возможность перегрузки по const. А еще, интересно и вполне логично, что, указатель, принадлежащий классу(если экземпляр имеет квалификатор const), рассматривается именно как константный указатель на неконстантные данные. Что дает возможность таскать с собой кусок памяти(для какого-нибудь счетчика, например) и модифицировать его в константных методах.
Также, открытием была возможность изменять тип возвращаемого значения виртуального метода(при условии что новый тип является наследником старого).
Пример кода:
class A { public: A(){} virtual ~A( ){} virtual A* copy( ) = 0; }; class B : public A { public: B( ){} ~B( ){} B* copy( ) { // здесь что-ниудь.. } };
KpeHDeJIb
> В начале это значит перед остальными аргументами в порядке размещения данным
> компилятором аргументов при передаче в функцию
Ну вот я и говорю, что все не так.
Ghost2
> GCC передает this на стеке (как cdecl, причем - последним параметром)
Значит теоретически можно на Си с Си++ работать, если знать манглинг имён.
Сейчас уже мало что удивляет, хотя и встречается кое-что интересное. Довольно подздно узнал про такие ключевые слова как volatile, explicit, mutable.
А недавно прочитал про расширения языка С в gcc. Просто ошеломительно: http://gcc.gnu.org/onlinedocs/gcc/C-Extensions.html. Оказывается там уже давно есть конструкция typeof, аналогичная decltype из нового стандарта уже С++, или вложенные функуции - почти лямбды. И вообще потом мне сказали, что в С++0х много того, что разработчики компиляторов уже реализоыввали, но что было неспецифицировано. То же выравнивание данных (не знаю, правда, есть оно в С++0х, или нет, но в С1х обещают), поддержка юникода.
Для меня из последних самым удивительным в C++ было это:
http://easy-coding.blogspot.com/2010/06/delete.html
Не понимаю наличие подобной очевидной глупости, источника трудно уловимых ошибок, в вполне уже устоявшемся языке.
Настоящим открытием стало бы существование стандартизированного ABI для C++.
Законный обход константности (пример из Дизайн и Эволюция языка C++)
const char cc = 'a'; const char* pcc = &cc; const char** ppcc = &pcc; void* pv = ppcc; char** ppc = (char**)pv; void f( ) { **ppc = 'x'; }
а чем const_cast хуже?
Вообще "Дизайн и эволющия С++" тоже полна открытий.
cNoNim
ничем. Собственно это было объяснение его появления.
mitroxa
> Union в таких случаях предпочтительней, наверно.
В общем-то да. Правда я не сразу въехал, как это сделать :)
Zefick
> Вообще "Дизайн и эволющия С++" тоже полна открытий.
+1
Причем и эволюция систем программирования в целом. Не так давно (по необходимости) начал изучать C# в работе с .NET. Изначально некоторые моменты (такие, как практическая невозможность reinterpret casting :( ) бесили, но когда въехал в общие принципы, технология неожиданно стала радовать, особенно обработка исключений :)
То, что при наличии шаблонного конструктора копирования/оператора присваивания при точном соответствии вызывается все равно дефолтовый. К счастью, это знание мне стоило всего 3 часов отладки, так как проект не успел разрастись.
аа..
template<> foo<char *>(); tempalte<> foo<char []>( ); template<> foo<char **>( ); template<> foo<char ( *)[]>( );
- четые абсолютно разных шаблона о_О
Zefick
> Вообще "Дизайн и эволющия С++" тоже полна открытий.
Точно! Приятно было узнать, что Страуструп размышлял над мультиметодами, но не сложилось (
Тема в архиве.