Укажите способы доступа к полям и методам класса
. - позволяет ссылке на объект получить доступ к полю структуры (класса). Пример: -> - позволяет ссылке на объект получить доступ к полю структуры (класса). 94. Зачем нужны методы с модификатором const? и как они используются. Когда метод не изменяет поля объекта, для которого он вызван, желательно в конце написать const void func () const { …} пример из перегрузки операторов: inline Chislo Chislo::operator + (const Chislo & c) const { Chislo m; m.mi = mi + c.mi; m.ma = ma + c.ma; return m;} 95. Как определить константный объект? Какие методы доступа применимы к нему? Если объект класса объявлен с модификатором const, он становится недоступным для изменения. Это означает, что для такого объекта можно вызвать только константные методы, поскольку только они гарантируют, что объект не будет изменен. int main() { const MyClass obj; … } 96. Какой параметр скрыто передается методу класса? Опишите использование ключевого слова this. Функции-члены класса (за исключением статических) получают в дополнение к списку параметров еще и неявный указатель this - адрес "своего" объекта, того, с которым они вызваны и поля которого они должны обрабатывать. Ключевое слово "this" представляет собой указатель на текущий объект класса. Методы класса могут использовать ключевое слово this чтобы получить указатель на объект для которого вызван данный метод. Указатель this представляет собой постоянную величину, мы не можем изменять его значение в своей программе. class my { int a; … public: my(могут быть параметры); //конструктор- без типа, совпадает с именем класса void b() { this->a=0; } … };
97. Можно ли построить класс без конструктора? Как в этом случае описать объекты класса? Если в классе не определить конструктор (хотя бы один), тогда компилятор создаст конструктор по умолчанию. Можно будет дать возможность пользователю изменять переменные самостоятельно, или же определить функции, которые будут изменять значения переменных. Определить конструктор в закрытой части можно. В этом случае доступ к конструктору может получить только дружественный класс, который должен быть объявлен как дружественный в объявлении данного класса. 98. Когда вызывается конструктор? Наследуется ли конструктор? Укажите синтаксис списка инициализаций при вызове конструктора. Можно ли определить конструктор в закрытой секции? Можно ли явно вызвать конструктор? Конструктор вызывается в момент создания объекта. Конструктор не наследуется. class my { const int a,b,c; public: my(могут быть параметры): a(5),b(3),c(4){}; … }; Определить конструктор в закрытой части можно. Оно компилится. Вот тока ни один объект создать не получится. Нет, вызвать явно конструктор нельзя.
99. Определите понятие «дружественная функция». Это функция, которая не является методом класса, но имеет доступ к его закрытой части. Дружественная функция может обращаться ко всем его элементам, включая private и protect. Одна и та же функция может быть дружественной для двух или более классов. class point {public: friend void point::Clear(point*); // Функция Clear объявляется дружественной классу point private: int m_x; int m_y; }; void Clear(point* ptrPoint) // Функция Clear { ptrPoint->m_x = 0; // Обращаемся к элементам класса, объявленным как private ptrPoint->m_y = 0; return;} void main()// Главная функция { point pointTestPoint; Clear(&pointTestPoint); // Вызываем дружественную функцию } 100. Опишите синтаксис деструктора.Зачем виртуализировать деструктор? Можно ли наследовать деструктор?Можно ли явно вызвать деструктор? class A { public: ~A(); }
A:: ~A() { …} Деструктор тоже ничего не возвращает и имеет название, совпадающее с именем класса, но перед ним стоит ~. Деструктор всегда ничего не принимает. Когда имеется иерархия классов, невозможно точно определить, куда указывает указатель. И тогда операция delete не будет работать. Объявив деструктор виртуальным, мы гарантируем, что для каждого производного класса будет замещен деструктор и объект правильно удалится. Пример:
class Base { public: ~Base() //невиртуальный деструктор //virtual ~Base()// виртуальный дестркутор - закоментен { cout << “Base удален\n”; } }; class Derv: public Base { public: ~Derv() { cout << “Derv удален\n”; } }; int main() { Base* pBase = new Derv; delete pBase; return 0; } Результат программы: Base удален //результат ошибочен, к такому результату привело то, что деструктор базового класса в приведенном листинге не виртуальный. Исправить это можно, заккоментировав первую строчку определения дестркуктора и активизировать другую. Результатом будет: Derv удален Base удален Наследовать деструктор нельзя. Явно вызвать деструктор вызвать … 101. Все ли операции могут быть перегружены? Можно ли перегрузить операции для базовых стандартных типов данных? Следующие операции не могут быть перегружены:
Кроме того, нельзя создавать новые операции (например, нельзя определить новую операцию возведения в степень **, которая есть в некоторых языках) и пытаться их перегрузить; перегружать можно только существующие операции. Для базовых стандартных типов тоже нельзя ничего перегрузить. 102. Зачем используют ключевое слово operator? Для перегрузки операторов. Сначала пишут возвращаемый тип, зачем ключевое слово operator, затем саму операцию (напр. ++) и наконец список аргументов, заключенных в скобки. Такой синтаксис говорит компилятору о том, что если операнд принадлежит классу, то нужно вызвать функцию с таким именем, встретив в тексте программы эту операцию. (пример: Chislo operator++();)
|