Участник:Yulya3102/Плюсы2сем — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Новая страница: «=== i8086 === === регистры общего назначения, сегментные регистры, регистр флагов === === некоторы...»)
 
(anonymous namespaces)
Строка 90: Строка 90:
 
=== Concepts ===
 
=== Concepts ===
 
=== anonymous namespaces ===
 
=== anonymous namespaces ===
 +
 +
You can declare an unnamed namespace as a superior alternative to the use of global static variable declarations.
 +
namespace { namespace-body }
 +
 +
An unnamed-namespace-definition having the syntax shown above behaves as if it were replaced by:
 +
namespace unique { namespace-body }
 +
using namespace unique;
 +
 +
Each unnamed namespace has an identifier, assigned and maintained by the program and represented here by unique, that differs from all other identifiers in the entire program. For example:
 +
// unnamed_namespaces.cpp
 +
// C2872 expected
 +
namespace { int i; }          // unique::i
 +
void f() { i++; }            // unique::i++
 +
 +
namespace A {
 +
    namespace {
 +
        int i;      // A::unique::i
 +
        int j;      // A::unique::j
 +
    }
 +
}
 +
 +
using namespace A;
 +
 +
void h()
 +
{
 +
    i++;            // C2872: unique::i or A::unique::i
 +
    A::i++;        // C2872: A::i undefined
 +
    j++;            // A::unique::j++
 +
}
 +
 +
Unnamed namespaces are a superior replacement for the static declaration of variables. They allow variables and functions to be visible within an entire translation unit, yet not visible externally. Although entities in an unnamed namespace might have external linkage, they are effectively qualified by a name unique to their translation unit and therefore can never be seen from any other translation unit.

Версия 23:48, 19 января 2013

Содержание

i8086

регистры общего назначения, сегментные регистры, регистр флагов

некоторые распространенные команды

команды для работы со стеком

соглашения вызова функций

32-битные регистры

stack frame

ошибки: возврат указателя на локальную переменную из функции, buffer-overrun для объектов в стеке

stack-smash protector

toolchain: препроцессор, транслятор, компоновщик

модификатор static

модификатор inline

one definition rule (ODR)

классы

конструкторы

деструкторы

const

ссылки

разница между ссылками и указателями

l-value, r-value

перегрузка операторов

оператор присваивания

разница между конструктором копирования и оператором присваивания

список инициализации

порядок инициализации/разрушения полей класса

volatile

директивы препроцессора

#include <>

#include ""

#define

#if

#else

#endif

#elif

#ifdef

#ifndef

#undef

include guards

#pragma once

#pragma once vs include guards

preprocessor pitfalls

циклический экспанд макросов

циклические зависимости на хедерах

неполные типы

name mangling

перегрузка функций

исключения

RAII

гарантии безопасности исключений

extern "C"

исключения в конструкторах

исключения в деструкторах

stack unwinding

возврат объектов из функции по значению, RVO

передача аргументов по значению, r-value/l-value

callback'и, способы фиксации аргументов у callback'ов

наследование, виртуальные функции, таблицы виртуальных функций

dynamic_cast

проблемы сишного typecast'а с неполными типами и несколькими базами, static_cast

const_cast, reinterpret_cast

зачем нужно виртуальное наследование (несколько баз с разными адресами у одного класса, typecast'ы, исключения)

виртуальное наследование

зачем нужны namespace'ы

namespace'ы, using declaration, using directive, namespace aliases

перегрузка операторов, ADL

зачем нужны шаблоны

базовое представление о шаблонах

два способа реализации шаблонов: Cfront-like, Borland-like, преимущества и недостатки обоих

специализация, частичная специализация

type_traits'ы

Контейнеры STL

Sequences: vector, list, deque

Associative Containers: [unordered][_multi]{set/map}

Итераторы, категории итераторов (Input, Output, Forward, Bidirectional, Random Access)

Примеры алгоритмов

find, find_if, search

remove, remove_if, прием с erase/remove_if

sort, stable_sort, partial_sort, nth_element

Много разговоров на тему того, что хоть явных ограничений на параметры шаблона нет, это не означает что их нет совсем.

копируемость/присваиваемость

требования к operator==

требования к operator<

согласованность operator== и operator<

разница между операторами внутри класса и снаружи (неявное приведение типов)

safe-bool

использование type_traits: SFINAE, tag-dispatching на примере STL

two-phase name lookup

STL: back-inserter, lower_bound, heap_*, priority_queue

const на примере STL

Concepts

anonymous namespaces

You can declare an unnamed namespace as a superior alternative to the use of global static variable declarations.

namespace { namespace-body }

An unnamed-namespace-definition having the syntax shown above behaves as if it were replaced by:

namespace unique { namespace-body }
using namespace unique;

Each unnamed namespace has an identifier, assigned and maintained by the program and represented here by unique, that differs from all other identifiers in the entire program. For example:

// unnamed_namespaces.cpp
// C2872 expected
namespace { int i; }          // unique::i
void f() { i++; }             // unique::i++

namespace A {
   namespace {
       int i;      // A::unique::i
       int j;      // A::unique::j
   }
}

using namespace A;

void h()
{
   i++;            // C2872: unique::i or A::unique::i
   A::i++;         // C2872: A::i undefined
   j++;            // A::unique::j++
}

Unnamed namespaces are a superior replacement for the static declaration of variables. They allow variables and functions to be visible within an entire translation unit, yet not visible externally. Although entities in an unnamed namespace might have external linkage, they are effectively qualified by a name unique to their translation unit and therefore can never be seen from any other translation unit.