C++ copy costructor -


im trying grasp copy constructors & i've found part of code.

 #include<iostream>     using namespace std;     class a1 {         int data;     public:         a1(int = 10) :                 data(i) {             cout << "i constructing a1 with: " << << endl;         }         a1(const a1& a1) :                 data(a1.data) {             cout << "i copy constructing a1" << endl;         }         ~a1() {             cout << "i destroying a1 with: " << data << endl;         }         void change() {             data = data * 10;         }     };     class a2 {         int data;     public:         a2(int = 20) :                 data(i) {             cout << "i constructing a2 with: " << << endl;         }         a2(const a2& a2) :                 data(a2.data) {             cout << "i copy constructing a2" << endl;         }         ~a2() {             cout << "i destroying a2 with: " << data << endl;         }         void change() {             data = data * 20;         }     };     class a3 {     public:         a3() {             cout << "i constructing a3" << endl;         }         a3(const a3& a3) {             cout << "i copy constructing a3" << endl;         }         ~a3() {             cout << "i destroying a3" << endl;         }         void change() {             cout << "nothing change" << endl;         }     };     class {         a1 a1;         a2 a2;         a3 a3;     public:         a() {             cout << "i constructing a" << endl;         }         a(const a& a) :                 a1(a.a1) {             cout << "i copy constructing a" << endl;         }         ~a() {             cout << "i destroying a" << endl;         }         a& operator=(const a& a) {             cout << "i performing stupid assignment between as" << endl;             if (this != &a)                 a1 = a.a1;             return *this;         }         void change() {             a1.change();             a2.change();             a3.change();         }     };     class biga {         data1;         a& data2;     public:         biga(a& a) :                 data1(a), data2(a) {             cout << "i constructed biga" << endl;         }         ~biga() {             cout << "i destroying biga" << endl;         }         get(int index) {             if (index == 1)                 return data1;             else                 return data2;         }     };         biga volta(biga& biga)      //biga& volta(biga& biga)             {         cout << "volta ta data?" << endl;         return biga;     }     int main() {         first;         biga biga(first);         volta(biga).get(2).change();         return 0;     } 

however,i can't understand why these results.especially,why a1 , copy constructor called , not constructor , don't @ when volta function called(the results enclosed ****) :

i constructing a1 with: 10 constructing a2 with: 20 constructing a3 constructing copy constructing a1 constructing a2 with: 20 constructing a3 copy constructing constructed biga **** volta ta data? copy constructing a1 constructing a2 with: 20 constructing a3 copy constructing copy constructing a1 constructing a2 with: 20 constructing a3 copy constructing nothing change destroying destroying a3 destroying a2 with: 400 destroying a1 with: 100 destroying biga destroying destroying a3 destroying a2 with: 20 destroying a1 with: 10 **** destroying biga destroying destroying a3 destroying a2 with: 20 destroying a1 with: 10 destroying destroying a3 destroying a2 with: 20 destroying a1 with: 10 

edit_assignmentoperatorquery : if add function in biga

void change() {     a& rdata1 = data1;     cdata2 = data2; } 

and call main : biga.change(); why instead of default assignment operator , copy-constructor , constructor being called ,

i copy constructing a1 constructing a2 with: 20 constructing a3 copy constructing 

edit_answeringmyownquery : found out initialization copy constructor , not assignment assignment operator.

let's start it.

a first;

you create object, fields (non-static members) initialized

"before compound statement forms function body of constructor begins executing, initialization of direct bases, virtual bases, , non-static data members finished."

i constructing a1 with: 10 constructing a2 with: 20 constructing a3 

and version of constructor without parameters being called:

i constructing 

when write

biga biga(first);

one of biga constructors invoked. takes reference a object, so, first not copied (reference set when providing value).

then, member initializer lists time comes,

biga(a& a) :             data1(a), data2(a) 

and data1 of type a, first object copied (it referenced here a)

a new a object created own copy constructor. @ first, calles copy constructor a1,

a(const a& a) : a1(a.a1)  copy constructing a1 

then, a's a2 , a3 fields default-initialized.

i constructing a2 with: 20 constructing a3  

the body of copy constructor a1 executed then:

i copy constructing 

let's return biga initialization. spoke data1 initialization until now, , time a& data2:

biga(a& a) :             data1(a), data2(a) 

as reference, , reference being passed initialize it, assignment, no output.

biga constructor (that takes a&) body executed then:

i constructed biga 

now, try clarify happens on

volta(biga).get(2).change();

this function being called:

biga volta(biga& biga) {     cout << "volta ta data?" << endl;     return biga; } 

again, pass reference results in no copy constructor call.

we have function body being executed:

"volta ta data?" 

the function returns unnamed object of class biga, copy constructor should called.

you have not provided copy constructor biga (const biga & biga), default copy constructor being invoked. sequential member initialization of a data1; , a& data2;

the first member initialized copying data1 field of unnamed object, copy constructor of a being called. printed here explained above (see: a new a object created own copy constructor...)

i copy constructing a1 constructing a2 with: 20 constructing a3 copy constructing 

then, get method runs index == 2

a get(int index) {         if (index == 1)             return data1;         else             return data2; // <--- line executed 

data2 a&, , method returns a, leads a copy constructor execution.

i copy constructing a1 constructing a2 with: 20 constructing a3 copy constructing 

at last, change runs

void change() {         a1.change();         a2.change();         a3.change();     } 

and a3.change() prints something:

nothing change 

on program termination

the destruction occurs in reverse order, , last created change'd object destroyed @ first.

i destroying destroying a3 destroying a2 with: 400 destroying a1 with: 100 

i destroying biga printed twice, i constructed biga - once. latter due have no copy constructor biga takes const & biga (it pointed out above).

answering query

void change() {     a& rdata1 = data1;     cdata2 = data2; } //in main(): biga.change(); 

yes, you're right copy constructor called here a cdata2 = data2; because object cdata2 uninitialized. case explained under ref.

if change code that

a cdata2; cdata2 = data2; 

you see expected assignment:

i constructing a1 with: 10 constructing a2 with: 20 constructing a3 constructing performing stupid assignment between 

Comments

Popular posts from this blog

javascript - jQuery: Add class depending on URL in the best way -

caching - How to check if a url path exists in the service worker cache -

Redirect to a HTTPS version using .htaccess -