inline
функции должно быть известно её определениеinline
функции можно определять в заголовочных файлахinline
.inline
-функции выбирается только одна.inline
функции должны быть идентичныinline
- это совет компилятору, а не указinline
функции не могут иметь больше одного определения (этап линковки).inline
функции могут определяться в более чем одной единице трансляции, но определения обязанны совпадать.friend
(удобно для переопределения операторов)
struct String {
...
friend std::ostream & operator << (std::ostream & os, String const & s) {
return os << s.data_;
}
private:
size_t size_;
char * data_;
};
struct String;
struct StringBuffer {
void append (string const & s);
void append (char const * s) { ... };
};
struct String {
friend void StringBuffer::append(String const & s);
};
void StringBuffer::append(String const & s) {
append(s.data_);
}
friend
, так как оно нарушеает инкапсуляцию.Объявление глобальных переменных
extern int global;
Определение глобальное переменной
global = 10;
При отсутствии определения, инициализируются 0 (в отличии от локальных переменных).
Хранится в специальном разделе памяти для хранения глобальных переменных.
static int global = 10;
void f () {
++global;
}
Статическая локальная переменная - это глобальная переменная, доступная только в пределах функции.
Время жизни такой переменной - от первого вызова функции до конца программы.
int next(int start = 0) {
static int k = start;
return k++;
}
next(10); // 10
next(20); // 11
.cpp
файлах можно определить статические функции с одним и тем же именем.Статические поля класса - это глобальные переменные, определённые внутри класса.
struct User {
User() {
++instances_;
}
~User() {
--instances_;
}
private:
static size_t instances_;
}
size_t User::instances_ = 0;
Статические методы - функции определённые внутри класса и имеющие доступ к закрытым полям и методам.
struct User {
...
static size_t count() { return instances_; }
static void transform(User user) {
// we are able to access private fields
}
private:
static size_t instances_;
}
struct Singleton {
static Singleton & instance() {
static Singleton s;
return s;
}
private:
Singleton () {}
Singleton(Singleton const &);
Singleton & operator=(Singleton const &);
};
Singleton & s = Singleton::instance();