Читайте также: |
|
Как и в случае обычных функций, конструктор может быть перегружен, т.е. в теле класса могут присутствовать несколько ф-ий конструкторов с одним и тем же именем, но различными типами или количеством параметров. Компилятор будет использовать ту функцию, которая наилучшим образом подходит в той точке программы, где она вызывается. В случае конструктора – это момент объявления (определения) объекта некоторого класса.
В случае, когда мы объявляем класс и не специфицируем какой-либо конструктор, компилятор автоматически “предполагает” наличие двух перегружаемых конструкторов: конструктор по умолчанию и конструктор копирования (" default constructor " и " copy constructor "). Например, для класса:
class CExample { public: int a,b,c; void multiply (int n, int m) { a=n; b=m; c=a*b; }; };без явного конструктора, компилятор автоматически считает, что существуют следующие функции-члены (конструкторы):
CExample::CExample () { };
Говоря точнее, конструктор копирования может принимать единственный аргумент, чей тип есть ссылка на тип (т.е. класс), для которого он будет вызван (дополнительные параметры, если они имеются, должны иметь аргументы по умолчанию). Ссылка, обычно с модификатором const , но не обязательно. Конструктор копирования вызывается для копирования объектов при передаче их в функции и при возвращении объектов из функций.
Следующий фрагмент кода иллюстрирует конструктор по умолчанию и копирующий:
struct point { point(); // Default constructor point(const point& pt); // Copy constructor...По умолчанию, конструктор копирования создается общедоступным (public).
Важно понимать, что оба конструктора по умолчанию, пустой и копирования, существуют только, если никакого другого конструктора явно не объявлено. (но: см. Подбельский: стр.291. “конструктор копирования существует всегда”) В случае, если какой-либо конструктор с любым числом параметров присутствует в классе, ни один(??) из конструкторов по умолчанию автоматически не генерируется. Поэтому, если мы хотим, чтобы такие конструкторы в нашем классе существовали, нам нужно определить собственные, явно. В общем случае, рекомендуется (особенно, для классов сложной конструкции, содержащих указатели и ссылки на другие объекты) писать собственный конструктор копирования и перегружать операцию присваивания, поскольку копирование по умолчанию подразумевает поэлементное копирование полей класса. Более корректно считать, что конструктор по умолчанию - это только “пустой” конструктор (обычно, без параметров). Этот конструктор вместе с конструктором копирования называются специальными видами конструкторов.
Конечно, мы можем также перегрузить конструктор класса, определив разные конструкторы для случаев с параметрами и без них:
// overloading class constructors #include <iostream.h> class CRectangle { int width, height; public: CRectangle (); CRectangle (int,int); int area (void) {return (width*height);}}; CRectangle::CRectangle () { width = 5; height = 5;}CRectangle::CRectangle (int a, int b) { width = a; height = b;} int main () { CRectangle rect (3,4); CRectangle rectb; cout << "rect area: " << rect.area() << endl; // rect area: 12 cout << "rectb area: " << rectb.area() << endl;// rectb area: 25 }В этом случае rectb был объявлен без параметров, поэтому он инициализирован с помощью конструктора, не имеющего параметров.
Заметим, что если при объявлении нового объекта мы не хотим передавать параметры, то скобки не пишутся:
Дата добавления: 2015-11-16; просмотров: 62 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Конструкторы и деструкторы | | | Указатели на классы |