У меня они такие:
1. Наличие указателей на члены класса-переменные. О том, как хорошо бы иметь такое средство, я думал задолго до того, как внезапно(ТМ) узнал, что они в С++ уже есть. (Где-то в местных анналах даже затесался пост на эту тему.)
2. Последнее открытие случилось сравнительно недавно, и потому тем более удивительно. Я понял, почему есть операторы && и ||, а оператора ^^ нету (хотя в некоторых специфических случаях его не хватает). Оказывается, он просто не нужен - вместо него можно использовать оператор !=. Вот оно как. 0_o
А у вас?
Перегрузка оператора "запятая".
1. Существование блоков { } самих по себе (т.е. без for'ов, if'ов и т.д.).
2. И то, что несколько идущих подряд строковых литералов считается как одно целое, т.е. например очень необычно видеть такое
#define STR "hello" printf("begin" STR "end");
присоединяюсь к 1,2 - круто )
мое не из с а из среды, но тем не менее: выделеный блок можно при помощи Shift+Tab сдвинуть на табуляцию влево
int a, *p; ... a = -1[p];
Nomad
Этого я до сих пор не понимаю :)
Sergio
a[b]
в C/C++ - сахар для
*(a + b)
поэтому работает в обе стороны
Объявление локальных классов внутри функций
1. узнал оператор ~
2. __asm{}
Sbtrn. Devil
> Наличие указателей на члены класса-переменные
Никак не пойму, что это означает.
> Самые удивительные открытия в С/С++, которые вам доводилось делать
Pokimon
Voltt
> > Наличие указателей на члены класса-переменные
> Никак не пойму, что это означает.
+1
Sbtrn. Devil
> 1. Наличие указателей на члены класса-переменные.
В первый раз слышу, это может стать открытием :) Всегда считал, что:
class CMyClass { public: CMyClass(); void Method( ); // Это метод int m_Member; // Это член }; // ... CMyClass* pPtr = new CMyClass( ); pPtr->Method( ); // здесь вызов метода через указатель pPtr->m_Member = 0; // это доступ к члену через указатель
Я в растерянности :)
А я понял как:
class CMyClass { public: CMyClass(); void Method( ); // Это метод int m_Member; // Это член }; // ... CMyClass my; int* pPtr = &my.m_Member; *pPtr = 0; // это доступ к члену через указатель
Для меня пока приятным открытием было, то что в производном классе при создании объекта
вызывается сначала конструктор базового по умолчанию)
Voltt
> Никак не пойму, что это означает.
Это крутейшая вещь.
struct A { int x; int y; }; void ProcessA (A &a,int ( A::*z)) { ( a.*z)++; } ... A a; ProcessA ( a, &A::x); // x++ ProcessA ( a, &A::y); // y++
Казалось бы, простая штука, но сколько полезных вещей можно с ней сделать! Например:
struct vector2d { int x,y; ... }; struct vector4d { int x,y,z,w; ... vector2d get_subvector2d (int ( vector4d::*x1),int ( vector4d::*x2)) { return vector2d ( this->*x1,this->*x2); } }; vector4d v = ...; vector2d vxy = v.get_subvector2d ( &A::x,&a::y); vector2d vyx = v.get_subvector2d ( &A::y,&a::x); vector2d vzz = v.get_subvector2d ( &A::z,&a::z); // а иначе пришлось копипастить 6... нет, 16 версий, для каждой возможной комбинации по штуке
Тема в архиве.