Показаны сообщения с ярлыком инициализация. Показать все сообщения
Показаны сообщения с ярлыком инициализация. Показать все сообщения

вторник, 29 марта 2011 г.

52. Разрешается ли объявлять массив в качестве поля класса. Как присвоить элементам массива начальные значения?

a. Можно, как и обычный локальный (статический или динамический) массив.
б. Только почленно меняя каждый элемент. Однако можно обнулить массив в списке инициализации: array().

Хорошо описано тут

среда, 2 марта 2011 г.

45. Какие конструкции С++ разрешается использовать в списке инициализации качестве инициализирующих выражений?

Что такое список инициализации? Инициализация членов класса путем явного вызова конструктора.

/* Класс реализующий комплексное число */
class Complex{
...
  Complex(float re, float im);
...
};

class Test{
  Complex a;
public:
  Test():a(3,-2){}
};

Встретил ответ, что используются lvalue, инициированные rvalue. Его нельзя счесть за правильный, разве что сделать кучу оговорок.
int a(1);
++a = 5;
++a это lvalue, так как префиксная операция инкремента возвращает ссылку на объект. Но это не инициализация, и мы не сможем добавить ++a в список инициализации. Но если вы видите, что lvalue инициируется rvalue (int a(1)), то такое можно добавить в список. И можно ли сказать, что a(3,-2) это lvalue инициированное rvalue?

Поэтому, я считаю, правильный ответ: в качестве инициализирующих выражений используются явные вызовы конструкторов.