- •Классы, Объекты и Методы
- •Struct DateStruct {
- •Int month;
- •Int year;
- •Методы классов
- •Void print () {
- •Int main () {
- •Int main () {
- •Int main () {
- •Спецификаторы доступа public и private
- •Int year; // открыто по умолчанию
- •Int main () {
- •Int main () {
- •Int main ()
- •Структуры. Классы
- •Инкапсуляция, Геттеры и Сеттеры Инкапсуляция
- •Int m_array[10];
- •Int main () {
- •IntArray array;
- •Void setValue(int index, int value) {
- •Функции доступа (геттеры и сеттеры)
- •Int m_month;
- •Int m_year;
- •Int main () {
- •Краткий обзор l-value и r-value
- •Инициализация ссылок
- •Ссылки в качестве параметров в функциях
- •Void changeN (int &ref) {
- •Int main () {
- •Int value1;
- •Int otherValue;
- •Ссылки. Указатели
- •Конструкторы
- •Int main () {
- •Конструкторы по умолчанию
- •Конструкторы с параметрами
- •Int m_numerator;
- •Int m_denominator;
- •Int getNumerator () {return m_numerator; }
- •Int getDenominator () {return m_denominator; }
- •Копирующая инициализация
- •Уменьшение количества конструкторов
- •Неявно генерируемый конструктор по умолчанию
- •Int main () {
- •Int main () {
- •Классы, содержащие другие классы
- •Int main() {
- •Список инициализации членов класса
- •Списки инициализации членов класса
- •Int m_value1;
- •Values() {
- •Int m_value1;
- •Инициализация массивов в классе
- •Инициализация переменных-членов, которые являются классами
- •Int main() {
- •Использование списков инициализации
- •Int m_value1;
- •Int m_value1;
- •Int m_value1;
- •Порядок выполнения в списке инициализации
- •Инициализация нестатических членов класса
- •Void print() {
- •Int main() {
- •Void print() {
- •Int main() {
- •Void print() {
- •Int main() {
- •Void print() {
- •Int main() {
- •Делегирующие конструкторы
- •Void DoX() {
- •Init();
- •Init();
- •Void Init()
- •Int main() {
- •Ещё о делегирующих конструкторах
- •Деструкторы
- •Имена деструкторов
- •Пример использования деструктора на практике
- •Выполнение конструкторов и деструкторов
- •Int getId() { return m_nId; }
- •Int main() {
- •Предупреждение о функции exit()
- •Скрытый указатель this
- •Скрытый указатель *this
- •Int m_number;
- •Int getNumber() { return m_number; }
- •Int main() {
- •Указатель this всегда указывает на текущий объект. Явное указание указателя this
- •Int data;
- •Цепочки методов класса
- •Заключение
Void changeN (int &ref) {
ref = 8;
}
Int main () {
int x = 7;
std::cout << x << '\n';
changeN (x); // обратите внимание, этот аргумент не обязательно
//должен быть ссылкой
std::cout << x << '\n';
return 0;
}
Результат выполнения программы:
7
8
Когда аргумент x передается в функцию, то параметр функции ref становится ссылкой на аргумент x.
Это позволяет функции изменять значение x непосредственно через ref!
Обратите внимание, переменная x не обязательно должна быть ссылкой.
Совет: Передавайте аргументы в функцию через неконстантные ссылки-параметры, если они должны быть изменены функцией в дальнейшем.
Основным недостатком использования неконстантных ссылок в качестве параметров в функциях является то, что аргумент должен быть неконстантным l-value (т.е. константой или литералом он быть не может).
Ссылки как более легкий способ доступа к данным
Второе (гораздо менее используемое) применение ссылок заключается в более легком способе доступа к вложенным данным. Рассмотрим следующую структуру:
struct Something {
Int value1;
float value2;
};
struct Other {
Something something;
Int otherValue;
};
Other other;
Предположим, что нам нужно работать с полем value1 структуры
Something переменной other структуры Other (звучит сложно, но такое также встречается на практике).
Обычно, доступ к этому полю осуществлялся бы через other.something.value1.
А что, если нам нужно неоднократно получать доступ к этому члену? В этом случае код становится громоздким и беспорядочным.
Ссылки же предоставляют более легкий способ доступа к данным:
int &ref = other.something.value1;
// ref теперь может использоваться вместо other.something.value1
Таким образом, следующие два оператора идентичны:
other.something.value1 = 7;
ref = 7;
Ссылки позволяют сделать ваш код более чистым и понятным.
Ссылки. Указатели
Ссылка — это тот же указатель, который неявно разыменовывается при доступе к значению, на которое он указывает (на нижнем уровне ссылки реализованы с помощью указателей).
Таким образом, в следующем коде:
int value = 7;
int *const ptr = &value;
int &ref = value;
*ptr и ref обрабатываются одинаково.
Т.е. это одно и то же:
*ptr = 7;
ref = 7;
Если определенное задание может быть решено с помощью как ссылок, так и указателей, то лучше использовать ссылки.
Указатели следует использовать только в тех ситуациях, когда ссылки являются недостаточно эффективными (например, при динамическом выделении памяти).
Заключение
Ссылки позволяют определять псевдонимы для других объектов. Ссылки на неконстантные значения могут быть инициализированы только неконстантными l-values. Они не могут быть переприсвоены после инициализации.
Ссылки чаще всего используются в качестве параметров в функциях, когда мы хотим изменить значение аргумента или хотим избежать его затратного копирования.
Конструкторы
1. Конструкторы по умолчанию
2. Конструкторы с параметрами
3. Копирующая инициализация
4. Уменьшение количества конструкторов
5. Неявно генерируемый конструктор по умолчанию
6. Классы, содержащие другие классы
Когда все члены класса (или структуры) являются открытыми, то мы можем инициализировать класс (или структуру) напрямую, используя список инициализаторов или uniform-инициализацию (в C++11):
class Boo {
public:
int m_a;
int m_b;
};
