Язык программирования C++ для профессионалов


Конструкторы - часть 2


inline complex& complex::operator+=(complex a) { re += a.re; im += a.im; return *this; }

При использовании этой функции не требуется временной переменной для хранения результата, и она достаточно проста, чтобы транслятор мог "идеально" произвести подстановку тела. Такие простые операции как сложение комплексных тоже легко задать непосредственно:

inline complex operator+(complex a, complex b) { return complex(a.re+b.re, a.im+b.im); }

Здесь в операторе return используется конструктор, что дает транслятору ценную подсказку на предмет оптимизации. Но для более сложных типов и операций, например таких, как умножение матриц, результат нельзя задать как одно выражение, тогда операции * и + проще реализовать с помощью *= и += , и они будут легче поддаваться оптимизации:

matrix& matrix::operator*=(const matrix& a) { // ... return *this; }

matrix operator*(const matrix& a, const matrix& b) { matrix prod = a; prod *= b; return prod; }

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

Пользовательское преобразование типа применяется только в том случае, если оно единственное(§7.3.3).

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




- Начало -  - Назад -  - Вперед -



Книжный магазин