C++ 3d.Комментарии


Явные конструкторы - часть 3


Полностью согласен -- все это действительно очень запутано, но разобраться все же стоит. Для более явной демонстрации исключения временной переменной я написал f2() и f3(): A f2() b.A::A() ?b.A::A(const A& b) b.A::~A() a это ?b ?b.A::~A() ---------- A f3() c.A::A() a это c c.A::~A()

В f3() оно происходит, а в f2() -- нет! Как говорится, все дело в волшебных пузырьках.

Другого объяснения нет, т.к. временная переменная могла была исключена в обоих случаях (ох уж мне эти писатели компиляторов!).

А сейчас рассмотрим более интересный случай -- перегрузку операторов. Внесем в наш класс соответствующие изменения: #include <stdio.h> #include <string.h>

struct A { static const int nsize=10; static int tmpcount;

int val; char n[nsize];

A(int val_) : val(val_) // для создания временных объектов { sprintf(n, "_%d", ++tmpcount); printf("%5s.A::A(int %d)\n", n, val); }

A(char cn, int val_) : val(val_) { n[0]=cn; n[1]=0;

printf("%5s.A::A(char, int %d)\n", n, val); }

A(const A& a) : val(a.val) { if (strlen(a.n)<=nsize-2) { n[0]='?'; strcpy(n+1, a.n); } else strcpy(n, "беда");

printf("%5s.A::A(const A& %s)\n", n, a.n); }

~A() { printf("%5s.A::~A()\n", n); }

A& operator=(const A& a) { val=a.val;

if (strlen(a.n)<=nsize-2) { n[0]='='; strcpy(n+1, a.n); } else strcpy(n, "беда");

printf("%5s.A::operator=(const A& %s)\n", n, a.n); return *this; }

friend A operator+(const A& a1, const A& a2) { printf("operator+(const A& %s, const A& %s)\n", a1.n, a2.n); return A(a1.val+a2.val); } };

int A::tmpcount;

int main() { A a('a', 1), b('b', 2), c('c', 3); A d=a+b+c; printf("d это %s\n", d.n); printf("d.val=%d\n", d.val); }

После запуска вы должны получить следующие результаты: a.A::A(char,int 1) b.A::A(char,int 2) c.A::A(char,int 3) operator+(const A& a,const A& b) _1.A::A(int 3) operator+(const A& _1,const A& c) _2.A::A(int 6) _1.A::~A() d это _2 d.val=6 _2.A::~A() c.A::~A() b.A::~A() a.A::~A()

Все довольно наглядно, так что объяснения излишни. А для демонстрации работы оператора присваивания попробуйте A d('d',0); d=a+b+c;

В данном случае будет задействовано на одну временную переменную больше: a.A::A(char,int 1) b.A::A(char,int 2) c.A::A(char,int 3) d.A::A(char,int 0) operator+(const A& a,const A& b) _1.A::A(int 3) operator+(const A& _1,const A& c) _2.A::A(int 6) =_2.A::operator=(const A& _2) _2.A::~A() _1.A::~A() d это =_2 d.val=6 =_2.A::~A() c.A::~A() b.A::~A() a.A::~A()




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