Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопросы по ООАПиП.doc
Скачиваний:
58
Добавлен:
14.05.2015
Размер:
107.52 Кб
Скачать
  1. Какой метод вызывается для инициализации класса?

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

  1. Как выглядит конструктор по умолчанию.

DefaultСonstructor Dc = new DefaultСonstructor();//Конструктор по умолчанию

  1. Пусть определены три объекта класса. Сколько копий атрибутов класса содержится в памяти? Сколько копий методов?

  2. Какой оператор используется для получения адреса переменной?

Для того, чтобы получить адрес в памяти, на который ссылается указатель, используется имя переменной-указателя с префиксом &.

  1. Какой оператор позволяет получить значение, записанное по адресу, содержаще­муся в указателе?

Для того, чтобы получить значение, которое находится по адресу, на который ссылается указатель, используется префикс*. Данная операция называется разыменованием указателя.

  1. Что такое указатель?

Указатель (англ. pointer) — переменная, диапазон значений которой состоит из адресов ячеек памяти или специального значения — нулевого адреса. Последнее используется для указания того, что в данный момент там ничего не записано.

  1. В чем различие между адресом, который хранится в указателе, и значением, записанным по этому адресу?

Адрес, сохраненный в указателе, - это адрес другой переменной. Значение, сохраненное по этому адресу, - это любое значение, сохраняемое в переменной, на которую ссылается указатель. Оператор разыменования (*) возвращает значение, сохраненное по адресу, который хранится в указателе.

  1. В чем различие между следующими объявлениями: const int * pOne и int * const pTwo?

Выражение const int * pOne объявляет, что переменная pOne представляет собой указатель на постоянное целое число. Само это целое число не может быть изменено с помощью данного указателя.Выражение int * const pTwo объявляет, что переменная pTwo является постоянным указателем на некоторое целое число. После такой инициализации этот указатель не может быть переназначен.

  1. Допустим, в программе объявлена переменная Age типа unsigned short. Как объявить указатель, позволяющий манипулировать этой переменной? С помощью указателя присвойте переменной Age значение 50.

unsigned short рАbе = &yourAge;

рАbе =50;

  1. Для каких целей используется оператор new? Что он возвращает? Напишите небольшую программу, в которой используются операторы new и delete.

Используется для создания объектов и вызова конструкторов.

int *p_var = new int;

int *p_array = new int[5];

delete p_var;

delete[] p_array;

  1. Как объявить массив объектов класса Dog в динамической памяти? Как освободить память, выделенную под этот массив?

int *Dog = new int[5];

delete[] Dog;

  1. Какая ошибка допущена в следующем объявлении?

class Square {

public:

int Side;

}

  1. Что отсутствует в объявлении этого класса?

class Dog {

int GetAge()const;

private:

int Age;

};

  1. Какие три ошибки обнаружит компилятор в следующем примере?

class Dog {

public:

void Set(int a);

int Get() сonst;

private:

int Age;

};

main(){

Dog myDog;

myDog.Age=4;

Dog.set(5);

Dog otherDog(2);

}

  1. Найдите ошибку в следующем фрагменте программы.

#include <iostream>

int main(){

int * pint;

* pint =9;

cout « "The value at pint: " << * pint;

return 0;

}

  1. Найдите ошибку в следующем фрагменте программы.

int main() {

int Variable = 5;

cout << "Variable: " << Variable << "\ n";

int *p = & Variable;

p = 9;

cout << "Variable: " << *p « "\ n";

return 0;

}

  1. Предположим, что класс string включает следующие собственные элементы:

class String {

private:

char * str; /* указывает на строку, которая размещена с помощью оператора new */

int len; // содержит длину строки

//. . .

};

a) Что неверно в конструкторе по умолчанию?

String::String() {}

b) Что неверно в этом конструкторе?

String::String(const char * s) {

str = s;

len = strlen(s);

}

c) Что неверно в этом конструкторе?

String::String(const char * s) {

strcpy(str, s) ; len = strlen(s);

}

Блок 2

  1. В чем разница между ссылкой и указателем?

указатель - переменная, содержащая адрес объекта ссылка - альтернативное имя объекта (тот же самый объект в памяти, но для удобства кодера назван по другому)

  1. Когда нужно использовать именно указатель, а не ссылку?

Используя ссылки, можно достигнуть такого уровня контроля, который невозможен при указателях. Например, вы не сможете забыть проинициализировать ссылочный член класса, не присвоете ему ноль или недопустимое значение, не вызовете delete раньше времени. Не менее важно то, что объекты, которыми инициализируются ссылочные типы-члены, имеют явно определенное время жизни и должны быть сконструированы до инициализации включающего класса. Соответственно, они будут разрушаться в обратном порядке, то есть проблема "висячих ссылок" в большинстве случаев снимается.

  1. Что такое конструктор копирования по умолчанию (явный и неявный). Когда в программе нужен явный конструктор копирования.

Конструктором копирования (в англоязычной литературе используется термин copy constructor) называется специальный конструктор в языке программирования C++, применяемый для создания нового объекта как копии уже существующего. Такой конструктор принимает как минимум один аргумент: ссылку на копируемый объект. Обычно компилятор автоматически создает конструктор копирования для каждого класса (известные как неявные конструкторы копирования, т.е. конструкторы копирования, заданные неявным образом), создается конструктор копирования, называемый в таком случае явным конструктором копирования (или "конструктором копирования, заданным явным образом").

Он используется:

  • когда объект создается и инициализируется другим объектом

  • когда объект в качестве значения функции

  • когда объект передается в функцию по значению в качестве аргумента

  • когда компьютер генерирует временный объект (например в случаи преобразования типов)

  1. Напишите объявление перегружаемого оператора постинкремента для некоторого класса.

  2. Что называют перегрузкой метода класса

C# допускается совместное использование одного и того же имени двумя или более методами одного и того же класса, при условии, что их параметры объявляются по-разному. В этом случае говорят, что методы перегружаются, а сам процесс называется перегрузкой методов.

  1. Какое правило существует при использовании параметров со значениями по умолчанию.

Основные правила при использовании значений параметров по умолчанию:

- если в определении функции параметр имеет умалчиваемое значение, то все параметры, которые следуют за ним, должны иметь умалчиваемые значения;

- если при вызове параметр с умалчиваемым значением отсутствует, то все параметры, которые следуют за ним, должны также отсутствовать.

  1. Напишите объявление перегружаемого оператора преинкремента для некоторого класса.

сonst SimpleCircle& SimpleCircle::operator++() { ++(itsRadius); return *this; } // постфиксный оператор Operator ++(int). // Выборка, затем инкрементирование const SimpleCircle SimpleCircle::operator++ (int) // обьявляем локальный обьект класса SimpleCircle и инициализируем его значением * this SimpleCircle temp(*this); ++(itsRadius); return temp; }

  1. Напишите объявление перегружаемого бинарного оператора суммы (+) для некоторого класса.

#include "String.h" int main() { String name1 "Sherlock"; String name2 "Holmes"; name1 += " "; name1 += name2; if (! ( name1 == "Sherlock Holmes" ) ) cout < < "конкатенация не сработала\n"; }

  1. Напишите объявление перегружаемого унарного оператора смены знака (-) для некоторого класса.

bool operator-( const String &s1, const String &s2 ) { return ( strcmp( s1.c_str(), s2.c_str() ) -= 0 ); }

  1. Напишите объявление перегружаемого оператора присваивания (=) для некоторого класса.

  2. Какая ошибка в следующей реализации конструктора копирования по умолчанию и деструктора? Какой оператор необходимо перегрузить для данного класса?

typedef unsigned int dlina;

const dlina n=30;

class Mouse{

dlina rost;

protected :

char * name;

public :

Mouse (const char * a="None"):rost(1){name=new char[n]; strcpy(name,a);}

~Mouse (){rost=0;}

Mouse (Mouse & A):rost(A.rost), name(A.name){}

};

Блок 3

  1. Объявите виртуальную функцию, которая принимает одно целочисленное значение и ничего не возвращает.

virtual void function(int i);

  1. Объясните специфику использования виртуальной функции.

виртуальная функция используется для создания общего кода и классы, которые расширяют класс с виртуальной функцией могут иметь собственные реализации виртуальной функции

3.Объясните специфику использования чисто виртуальной функции

чисто виртуальная функция не содержит тела при объявлении, поэтому все классы которые расширяют класс с чисто виртуальной функцией должны иметь свою реализацию чисто виртуальной функции

4.Виртуальность функции передается из базового класса в производных класс при замещении этой функции в производном классе?

нет,если абстрактный класс с общим кодом, а конкретные реализации это частные случаи

5.Запишите объявление класса Квадрат, произведенного (унаследованного) от класса Многоугольник, который, в свою очередь, произведен от класса Геометрическая фигура на плоскости.

6.Предположим, что объект класса Фигура не использует параметры, объект класса Многоугольник принимает два параметра (length и width), а объект класса Квадрат — один параметр (length); запишите конструктор для класса Квадрат.

7.Как вызвать функцию базового класса для объекта производного класса, если в производном классе эта функция была замешена?

Base::FunctionName();

8.Как вызвать функцию базового класса из объекта производного класса, если в производном классе эта функция не была замешена?

FunctionName():

9.Если в базовом классе функция объявлена как виртуальная, а в производном классе виртуальность функции указана не была, сохранится ли функция как виртуальная в следующем произведенном классе?

Да, виртуальность наследуется и не может быть отменена.

10.С какой целью используется ключевое слово protected?

Защищенные члены (которые объявлены с использованием ключевого слова protected) доступны для функций-членов производных объектов.

11.Можно ли в производном классе описать как private функцию, которая перед этим была описана в базовом классе как public? Можно. Функция может быть не только защищена в производном классе, но и закрыта. Она останется закрытой для всех последующих классов, произведенных от этого.

12.Виртуальные функции позволяют

а) создавать массивы типа «указатель па базовый класс», которые могут содержать указатели на производные классы;

б) создавать функции, к которым никогда не будет доступа;

в) группировать объекты разных классов так, чтобы они все были доступны с помощью одного и того же вызова функции;

г) использовать один и тот же вызов функции для выполнения методов объектов, принадлежащих разным классам.

13.Истинно ли утверждение о том, что указатель на базовый класс может ссылаться на объекты порожденного класса?

Указатель на класс-предок может ссылаться и на любые дочерние классы; обратное невозможно

14.Пусть указатель р ссылается на объекты базового класса и содержит адрес объекта порожденного класса. Пусть в обоих этих классах имеется невиртуальный метод print(). Метод какого класса будет выполнен при использовании в программе выражения p->print()?

15.Можно ли в одном классе перегрузить виртуальный метод, чисто виртуальным методом? Если это сделать можно, приведите пример.

16.Пусть указатель р ссылается на объекты базового класса и содержит адрес объекта порожденного класса. Пусть в обоих этих классах имеется виртуальный метод print().

17.Метод какого класса будет выполнен при использовании в программе следующего выражения: (*p).print?

18.Напишите пример чистой виртуальной функции, не возвращающей значений и не имеющей аргументов.

class A {   public:    virtual void v_function(void)=0;//чистая виртуальная функция };

19.Чистая виртуальная функция — это виртуальная функция, которая:

а) делает свой класс абстрактным;

б) не возвращает результата;

в) используется в базовом классе;

г) не имеет аргументов.

20.Напишите определение массива Pets, содержащего 10 указателей на объекты класса Dog.

21.Абстрактный класс используется, когда:

а) не планируется создавать порожденные классы;

б) есть несколько связей между двумя порожденными классами;

в) запрещено создавать какие-либо объекты этого класса;

г) не планируется использовать множественное наследование

Блок 4

  1. Истинно ли утверждение о том, что дружественная функция имеет доступ к скрытым данным класса, не являясь его методом?

да,Это функция, объявленная с целью получения доступа к защищенным и закрытым членам другого класса

  1. Дружественная функция может быть методом другого класса?

Дружественная функция может быть обычной функцией или методом другого класса, определенного ранее. На нее не распространяется действие спецификаторов доступа. Одна функция может быть дружественной сразу нескольким классам.

  1. Напишите прототип дружественной функции print(), возвращающей результат типа void и имеющей один аргумент: ссылка на объект класса Mouse.

  2. Может ли дружественная функция иметь доступ к закрытым данным нескольких классов? Если может, то приведите пример объявления такой функции

  3. Ключевое слово friend может быть использовано в объявлении класса только в разделе public?

Объявление друга начинается с ключевого слова friend и может встречаться только внутри определения класса. Так как друзья не являются членами класса, то не имеет значения, в какой секции они объявлены ЕПТ.

  1. Зачем нужен дружественный класс?

для того чтобы все его функции-члены были дружественными по отношению к другому классу.

  1. Дружественность передается по наследству?

дружественность классов не наследуется.

  1. В чем специфика использования Статического атрибута?

  2. Можно ли объявить статический атрибут класса в разделе private?

Да. Поскольку они являются переменными-членами, то доступ к ним может управляться подобно доступу к любым другим переменным-членам. Если статическая переменная-член объявлена как закрытая, то доступ к ней можно получить только с помошью открытого статического метода класса.

  1. Статический атрибут базового класса передается по наследству в производный класс? Статический метод?

  2. В чем специфика использования статического метода?

статические методы не имеют доступа к данным объекта и для их использования не нужно создавать экземпляры (данного класса).В то время как простые методы имеют доступ к данным объекта (конкретного экземпляра данного класса).

  1. В каких случаях следует явно перегружать оператор присваивания?

  2. В чём схожесть и отличие операций, выполняемых оператором присваивания и конструктором копирования?

Оператор присваивания работает с существующим объектом, а конструктор-копировщик создает новый временный объект.

  1. Объясните разницу в выполнении следующих двух выражений:

Dog Tomy(Djec);

Dog Tomy = Djec;

  1. На что ссылается указатель this?

Он указывает на сам объект.

  1. Если класс Dog является другом Mouse, то можно ли сказать, что Mouse – друг Dog?

Нет, дружественность классов не взаимна.

  1. Если класс Dog является другом Mouse, a BigDog произведен от Dog, является ли BigDog другом Mouse?

Нет, дружественность классов не наследуется.

  1. Если класс Dog является другом Mouse, а Mouse – другом Leon, можно ли считать Dog другом Leon?

Нет, дружественность классов не ассоциативна

  1. Найти ошибки:

class Dog;

void set(Dog& , int);

class Dog{

int rost; int age. public:

int getrost()const { return rost; }

int getage() const { return age; }

};

void set(Dog& Tomy, int i){

friend class Dog;

Tomy.rost = i;

}

int main(){

Dog Djec; set(Djec,5);

}

  1. Найти ошибки

class Mouse; void set(Mouse& . int);

void set(Mouse& ,int,int);

class Mouse{

friend void set(Mouse& .int);

private:

int weight;

int age;

};

void set(Mouse& Tom. int i){

Tom.weight = i;} void set(Mouse& Tom, int pweight, int page){

Tom.weight = pweight;

Tom.age = page;} int main(){

Mouse Lisa;

set(Lisa,5);

set(lisa,Lisa.age+1,9);}

  1. Найти ошибки:

class Shape{

public:

virtual Shape(){}

virtual ~Shape()

};