Сергей Талантов (hitfounder) wrote,
Сергей Талантов
hitfounder

Category:

Скрытые возможности С++

Хотите ли вы открыть ящик Пандоры с неплохим наборчиком крючков? Добро пожаловать под кат.

1. В коде можно написать ссылку на сайт, ошибок не будет, т.к. компилятор посчитает, что http это метка:

Copy Source | Copy HTML
  1. void foo() {
  2.     http://somesite.com/
  3.     int bar = 4;
  4.     ...
  5. }
2. Тернарный условный оператор можно использовать как lvalue, хотя никакой практической необходимости в этом нет:

(a == 0 ? a : b) = 1;

3. Можно делать не только шаблоны классов и структур, но и шаблоны смесей (union), тоже сомнительное удовольствие:

Copy Source | Copy HTML
  1. template<typename From, typename To> union union_cast {
  2.     From from;
  3.     To to;
  4.  
  5.     union_cast(From from)
  6.         :from(from) { }
  7.  
  8.     To getTo() const { return to; }
  9. };
4. Доступ к элементам массива может происходить так: a[10], а может и так 10[a]. Все потому что a[10] это синоним *(a + 10), от перестановки мест слагаемых сумма не меняется, поэтому можно записать так *(10 + a), а это уже синоним 10[a]

5. Можно включить отлов исключений для всей функции в целом, опуская основной блок { }:

Copy Source | Copy HTML
  1. int Function()
  2. try
  3. {
  4.    // do something here
  5.    return  0;
  6. }
  7. catch(...)
  8. {
  9.    return -1;
  10. }
6. Значение параметра по умолчанию можно изменить во время рантайма при помощи статических переменных и переопределения функции:

Вот так можно сменить при помощи статической переменной:

Copy Source | Copy HTML
  1. static int val = 200;
  2. void g(int x = val); // default argument is a static variable.
  3.  
  4. int main(void)
  5. {
  6.    g(); // g(200)
  7.    val = 500;
  8.    g(); // g(500)
  9. }
Вот так можно сменить при помощи переопределения функции:
Copy Source | Copy HTML
  1. void f(int x = 7);
  2.  
  3. int main(void)
  4. {
  5.    f(); // f(7)
  6.    void f(int x = 70);
  7.    f(); // f(70)
  8. }
7. Объявлять переменные можно в операторе if, область видимости при этом распространяется на блок then и else:
Copy Source | Copy HTML
  1. if(int * p = getPointer()) {
  2.     // do something
  3. }
8. Анонимные namespace, объявленные в них переменные, классы и функции будут доступны только в пределах файла:

namespace {
// Classes, methods or variables here.
}

9. У регулярных типов тоже есть конструкторы:

// it works
int i(3);
Tags: c++, код
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 3 comments