Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CPlusPlusNotesForProfessionals.pdf
Скачиваний:
47
Добавлен:
20.05.2023
Размер:
5.11 Mб
Скачать

Chapter 29: Copying vs Assignment

rhs

Right Hand Side of the equality for both copy and assignment constructors. For example the

assignment constructor : MyClass operator=( MyClass& rhs );

 

Placeholder Placeholder

Section 29.1: Assignment Operator

The Assignment Operator is when you replace the data with an already existing(previously initialized) object with some other object's data. Lets take this as an example:

// Assignment Operator #include <iostream> #include <string>

using std::cout; using std::endl;

class Foo

{

public:

Foo(int data)

{

this->data = data;

}

~Foo(){};

Foo& operator=(const Foo& rhs)

{

data = rhs.data; return *this;

}

int data;

};

int main()

{

Foo foo(2); //Foo(int data) called Foo foo2(42);

foo = foo2; // Assignment Operator Called cout << foo.data << endl; //Prints 42

}

You can see here I call the assignment operator when I already initialized the foo object. Then later I assign foo2 to foo . All the changes to appear when you call that equal sign operator is defined in your operator= function. You can see a runnable output here: http://cpp.sh/3qtbm

Section 29.2: Copy Constructor

Copy constructor on the other hand , is the complete opposite of the Assignment Constructor. This time, it is used to initialize an already nonexistent(or non-previously initialized) object. This means it copies all the data from the object you are assigning it to , without actually initializing the object that is being copied onto. Now Let's take a look at the same code as before but modify the assignment constructor to be a copy constructor :

// Copy Constructor #include <iostream> #include <string>

GoalKicker.com – C++ Notes for Professionals

140

using std::cout; using std::endl;

class Foo

{

public:

Foo(int data)

{

this->data = data;

}

~Foo(){}; Foo(const Foo& rhs)

{

data = rhs.data;

}

int data;

};

int main()

{

Foo foo(2); //Foo(int data) called

Foo foo2 = foo; // Copy Constructor called cout << foo2.data << endl;

}

You can see here Foo foo2 = foo; in the main function I immediately assign the object before actually initializing it, which as said before means it's a copy constructor. And notice that I didn't need to pass the parameter int for the foo2 object since I automatically pulled the previous data from the object foo. Here is an example output : http://cpp.sh/5iu7

Section 29.3: Copy Constructor Vs Assignment Constructor

Ok we have briefly looked over what the copy constructor and assignment constructor are above and gave examples of each now let's see both of them in the same code. This code will be similar as above two. Let's take this

:

// Copy vs Assignment Constructor #include <iostream>

#include <string>

using std::cout; using std::endl;

class Foo

{

public:

Foo(int data)

{

this->data = data;

}

~Foo(){}; Foo(const Foo& rhs)

{

data = rhs.data;

}

Foo& operator=(const Foo& rhs)

{

data = rhs.data;

GoalKicker.com – C++ Notes for Professionals

141

return *this;

}

int data;

};

int main()

{

Foo foo(2); //Foo(int data) / Normal Constructor called Foo foo2 = foo; //Copy Constructor Called

cout << foo2.data << endl;

Foo foo3(42);

foo3=foo; //Assignment Constructor Called cout << foo3.data << endl;

}

Output:

2

2

Here you can see we first call the copy constructor by executing the line Foo foo2 = foo; . Since we didn't initialize it previously. And then next we call the assignment operator on foo3 since it was already initialized foo3=foo;

GoalKicker.com – C++ Notes for Professionals

142