воскресенье, 23 января 2011 г.

41. Как проинициализировать динамическую переменную?

С помощью оператора new, а также его разновидностей.

Динамическая переменная может инициализироваться следующими способами:
1.
class A {/* определение класса */};
A* pa = new A(); /*Какой-либо конструктор.*/
delete pa; /*Не забываем освободить память*/
Динамическим может быть не только объект:
int* pi = new int(1);
cout << *pi;
delete pi;

2. placement new. Не выделяет память, а размещает объект в заранее определённом месте.
int i = 1;
int* j = new(&i) int(2); /*Разместили по томо же адресу, что и i.*/
cout << i << "\n"; /*Значение i затерто*/

3. nothrow new. В случае нехватки памяти, при вызове обычного new, им генерируется исключение std::bad_alloc. А new(nothrow) просто возвращает 0.

Пробежался по верхам, так как о new еще будут вопросы. А пока задам вопрос случайно заглянувшему читателю: бывает ли nothrow версия оператора placement new и почему?

суббота, 8 января 2011 г.

40. Приведите несколько случаев, когда конструктор вызывается неявно.

Приведение типа, передача по значению, копирование, конструирование внутренних объектов. Конструктор внутренних объектов вызывает сгенерированный конструктор по умолчанию, решил в примере не отражать, и так понятно :)
class A{
  int x;
public:
  A(){};
  A(int p):x(p){};
  A(A const& a){x = a.x;}
};

A f(A a){
  return 3; //это return A(3); пример 3.
}

A g(A a){ 
  return a; //Вызов конструктора копирования. пример 5.
}

int main(){
  A a;
  a = 1; /*это a = A(1); пример 1.*/
  f(2); /*это f(A(2)); пример 2.*/
  g(a); /*Вызов конструктора копирования. пример 4.*/
}

39. Может ли конструктор быть приватным? Какие последствия влечет за собой объявление конструктора приватным?

Может. Конструктор нельзя будет вызвать (кроме как из члена этого класса), а значит создать объект будет невозможно, если не предусмотреть способ вызова конструктора из члена класса. Примечание: если мы объявили какой-нибудь конструктор, даже приватный, то конструктор по умолчанию создан не будет.
Используется, например, в реализациях паттерна singleton

38. Сколько конструкторов может быть в классе? Допускается ли перегрузка конструкторов? Какие виды конструкторов создаются по умолчанию?

a. С разными параметрами сколь угодно.
b. Да. Они подчиняются тем же правилам разрешения перегрузок, что и обычные методы.
c. Конструктор по умолчанию (без параметров), конструктор копирования.

37. Дайте определение конструктора. Каково назначение конструктора? Перечислите отличия конструктора от метода.

Ответ вкратце, благо информация по этому вопросу есть в любой книге.
a, b. Особый метод предназначенный для инициализации объектов класса.
c. Конструктор не возвращает значение, не наследуется