Skip to content

Instantly share code, notes, and snippets.

@NickTikhomirov
Last active June 19, 2019 18:43
Show Gist options
  • Save NickTikhomirov/051349d9997ce66439a7176792ce19cb to your computer and use it in GitHub Desktop.
Save NickTikhomirov/051349d9997ce66439a7176792ce19cb to your computer and use it in GitHub Desktop.
Основы (кроме конструкторов)

Вопросы 1,2,4,5, Основы

Автор: Никита

Головной раздел: Меню

Билет 1. Классы в языке С++: объявление, поля и методы классов. Определение функций внутри класса и за пределами класса, примеры.

Класс - это структура, в которую в языке С++ введены методы для обработки полей.

Ключевые слова для объявления класса:

  • struct
  • class
  • union
И да, union тоже умеет в методы

Образец объявления:

<ключевое слово> <имя класа>{
  <компоненты>
};

В качестве ключевого слова может использоваться как struct, так и class. Разницы никакой кроме того, что у class все поля по умолчанию имеют статус доступа private, а у struct (и union) - по умолчанию public. Это единственная разница между классом и структурой.

Компоненты класса: поля и методы.

Инициализация полей происходит раньше конструктора.

Модификатор const на методе (в конце заголовка метода) запрещает ему обращаться к полям класса с целью изменений.

Модификатор mutable на поле класса (перед полем) позволяет методам с модификатором "const" изменять его.

Методы внутри класса и вне его.

Пример объвления метода внутри класса. Этот метод будет, по возможности, подставляемым - его текст компуктор будет просто брать и пихать в то место, где происходит вызов

class a{
  int answer(){
    return 42;
  }
};

Пример объвления метода вне класса. В его случае всё будет как обычно - передача управления на функцию, все дела.

class a{
  int answer();
};

int a::answer(){
    return 42;
}

__________________________________________________________________

Билет 2. Статусы доступа компонент класса. Операции для доступа к компонентам класса, примеры.

Свойство доступности определяет возможность доступа к полям и методам за пределами класса (через имя объекта или через указатель на объект или в производном классе).

Ключевые слова для объявления класса:

  • public -- Свободный доступ для методов, потомков и вызовов извне
  • protected -- Только для методов и потомков
  • private -- Только для методов

Образец объявления:

<ключевое слово> <имя класа>{
  <компоненты1>          // По умолчанию у класса private, у структуры и объединения - public
public:
  <компоненты2>
private:
  <компоненты3>
protected:
  <компоненты4>
public:                  // Можно повторять статусы доступа
  <компоненты5>
};

Операции доступа:

"Сеттеры" и "геттеры" (жарг.), от слов set и get. Не являются какими-то особыми фичами или ключевыми словами, а представляют собой скорее определённый стиль программирования и аттрибут "хорошего кода". То есть считается хорошим тоном сделать поля protected или private, а затем для каждого поля написать setX() и getX(), где X - название поля. Практическая польза - в этих функциях могут быть представлены какие-то проверки или преобразования для значений, чтобы, например, в поле класса не поставили неправильное число. "Геттеры" чаще всего делают с модификатором const.

__________________________________________________________________

Билет 4. Статические компоненты класса, назначение, пример.

Перед полем или методом можно дописать ключевое слово static - тогда он(о) станет станет статическим. На статические поля и методы распространяются модификаторы доступа.

Статическое поле существует в единственном числе вне зависимости от количества объектов класса. Для всех них оно одинаково. Получить к нему доступ можно либо через имя класса (A::a), либо через имя какого-нибудь объекта этого класса. Инициализировать статическое поле надо вне класса, потому что иначе будут происходить всякие странности вроде переинициализации поля с каждым созданным объектом.

Статический метод - такой метод, который может быть вызван по имени класса, даже если не создано ни одного объекта этого класса. Он не взаимодействует ни с какими полями и методами класса кроме статических. К нем можно обращаться точно так же, как к ст.полю.

__________________________________________________________________

Билет 5. Указатель this, примеры использования.

Из курса алгоритмических языков мы знаем, что функции хранятся в стеке, а ещё при вызове не-inline функции у нас происходит передача управления на функцию. Также мы знаем, что методы класса взаимодействуют с полями того объекта, для которого они вызваны. То есть мой геттер фамилии возвращает именно мою фамилию, а не, например, Толину. В связи с этим возникает вопрос - у нас что, все методы класса дублируются столько раз, сколько объектов мы создадим? Прям за каждый объект в стек функций докладывается ещё одна?

Ответ: нет. Просто у каждого (не static) метода есть секретный аргумент - указатель на конкретный объект. Когда мы вызываем метод для какого-то объекта, в него передаётся указатель на него - так функция понимает, с чьими конкретно полями она работает. Программисту тоже разрешено взаимодействовать с этим указателем через ключевое слово this, которое по умолчанию определено внутри каждого (не static) метода любого класса.

Зачем его можно использовать?

0) Например, мы хотим, чтобы метод возвращал нам указатель на этот самый объект => "return this;"
Или у нас есть vector указателей на объекты, мы его по ссылке передаём в метод, и объект кладёт свой указатель 
в этот вектор, только это говнокод.
1) Если у нас какой-то из аргументов метода зовут так же, как и какое-то поле класса. Не понятно, правда, зачем вы 
так его обозвали, но, если такое произошло, то указатель this тоже приходит на помощь. 
Итак, допустим у вас аргумент называется name и поле называется name. Если вы в тексте метода напишете слово name 
(чтобы что-то с ним сложить или присвоить или проверить...), то программа решит, что вы подразумеваете тот name, 
который аргумент. А к name, который поле, обращаемся как раз по указателю this. Например, "this->name=name;". Эта 
строчка положит name-аргумент в name-поле. И ещё раз, это не я странно объясняю, это вы хреново аргументы называете.
х) Самое странное применение this: если у вас плохая память, и вы позабывали названия полей и методов или у вас про-
сто огромная матрёшка из наследований, половину из которых сделалали даже не вы (привет, qt!), то можно написать 
"this->", и любая нормальная среда разработки покажет вам список того, что можно написать дальше (т.е. список мето-
дов и полей), 
НО ЭТО, ОЧЕВИДНО, УЖЕ НЕ ПРО ЯЗЫК С++, А ПРО ВЫБОР СРЕДЫ РАЗРАБОТКИ. 
КАК ОСНОВНОЕ ДОСТОИНСТВО УКАЗАТЕЛЯ this БЫКОВУ ЭТО НЕ НАЗЫВАЙТЕ.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment