How to prevent object copy in C++

In this tutorial, we will learn how to prevent object copy in C++. This can be done in 3 ways and we shall implement each of these.

Making the access specifier of Copy constructor and Copy assignment operator private

#include <iostream> 
using namespace std; 

class Student
{ 
  int roll; 
  public: 
    Student() { } 
    Student(int x)
    {
      roll=x;
    }
  private: 
    // Copy constructor 
    Student(const Student& obj) 
    {
      roll=obj.roll;
    } 
    // Copy assignment operator 
    Student& operator=(const Student& obj) 
    { 
      roll = obj.roll; 
      return *this; 
    } 
}; 

int main() 
{ 
  Student s1(10); 
  Student s2(s1); // calling copy constructor 
  s2 = s1; // calling copy assignment operator 
  return 0; 
} 

Here, when we are calling the copy constructor and copy assignment operator we encounter an error. This is because these two are private. Thus preventing object copying.

Output:

15 3 [Error] 'Student::Student(const Student&)' is private
31 15 [Error] within this context
20 12 [Error] 'Student& Student::operator=(const Student&)' is private
32 5 [Error] within this context

Deleting the Copy constructor and Copy assignment operator

#include <iostream> 
using namespace std; 

class Student
{ 
  int roll; 
  public: 
    Student() { } 
    Student(int x)
    {
      roll=x;
    }
    // Copy constructor 
    Student(const Student& obj) = delete;
    // Copy assignment operator 
    Student& operator=(const Student& obj) = delete;
}; 


int main() 
{ 
  Student s1(10); 
  Student s2(s1); // calling copy constructor 
  s2 = s1; // calling copy assignment operator 
  return 0; 
} 

We have deleted both the copy constructor and the copy assignment operator so, while calling them we get errors. Thus preventing object copying.

Output:

23 15 [Error] use of deleted function 'Student::Student(const Student&)'
14 3 [Note] declared here
24 5 [Error] use of deleted function 'Student& Student::operator=(const Student&)'
16 12 [Note] declared here

Through inheritance i.e., by making the Copy constructor and Copy assignment operator private in the base class

#include <iostream> 
using namespace std; 

class Base
{ 
  public: 
      Base() {  } 
  private: 
      // Copy constructor 
      Base(const Base& obj) {   } 
      // Copy assignment operator
      Base& operator=(const Base& obj) {   } 
}; 

class Student : public Base
{ 
  int roll; 
  public: 
    Student() { } 
    Student(int x)
    {
      roll=x;
    }
}; 


int main() 
{ 
  Student s1(10); 
  Student s2(s1); // calling copy constructor 
  s2 = s1; // calling copy assignment operator 
  return 0; 
} 

Both the copy constructor and the copy assignment operator are private in the Base class thus preventing object copying and producing error while doing so.

Output:

In copy constructor 'Student::Student(const Student&)':
10 6 [Error] 'Base::Base(const Base&)' is private
15 7 [Error] within this context
In function 'int main()':
30 15 [Note] synthesized method 'Student::Student(const Student&)' first required here
In member function 'Student& Student::operator=(const Student&)':
12 12 [Error] 'Base& Base::operator=(const Base&)' is private
15 7 [Error] within this context
In function 'int main()':
31 5 [Note] synthesized method 'Student& Student::operator=(const Student&)' first required here

This is how we prevent object copy in C++.

You may also read,
Copy Constructor in C++
Inheritance in C++

Leave a Reply

Your email address will not be published. Required fields are marked *