C++/Class/Copy Constructor

Материал из C\C++ эксперт
Перейти к: навигация, поиск

A copy constructor to allow StringClass objects to be passed to functions.

<source lang="cpp">

  1. include <iostream>
  2. include <cstring>
  3. include <cstdlib>

using namespace std; class StringClass {

 char *p;

public:

 StringClass(char *s);           // constructor
 StringClass(const StringClass &o);  // copy constructor
 ~StringClass() {                // destructor
    delete [] p; 
 } 
 char *get() { 
    return p; 
 }

};

StringClass::StringClass(char *s) // "Normal" constructor {

 int l;
 l = strlen(s)+1;
 p = new char [l];
 if(!p) {
   cout << "Allocation error\n";
   exit(1);
 }
 strcpy(p, s);

}

StringClass::StringClass(const StringClass &o) // Copy constructor {

 int l;
 l = strlen(o.p)+1;
 p = new char [l];                  // allocate memory for new copy
 if(!p) {
   cout << "Allocation error\n";
   exit(1);
 }
 strcpy(p, o.p);                    // copy string into copy

} void show(StringClass x) {

 char *s;
  
 s = x.get();
 cout << s << endl;

} int main() {

 StringClass a("www.java2s.com"), b("www.java2s.com");
 show(a);
 show(b);
 return 0;

}


 </source>


copy constructor: X(X&)

<source lang="cpp">

  1. include <iostream>

using namespace std; class MyClass {

  private:  
     int data;  
  public:  
     MyClass(){ }  
     MyClass(int d){ data = d; }  
     MyClass(MyClass& a){  
        data = a.data;  
        cout << "\nCopy constructor invoked";  
     }  
     void display(){ cout << data; }  
     void operator = (MyClass& a) 
     {  
        data = a.data;  
        cout << "\nAssignment operator invoked";  
     }  

}; int main(){

  MyClass a1(37);  
  MyClass a2;  
 
  a2 = a1;                        
  cout << "\na2="; a2.display();  
 
  MyClass a3(a1);                   
  cout << "\na3="; a3.display();  
  return 0;  

}


 </source>


Demonstrating that class objects can be assigned to each other using default memberwise copy

<source lang="cpp">

  1. include <iostream>

using std::cout; using std::endl; class Date { public:

  Date( int = 1, int = 1, int = 1990 ); // default constructor
  void print();

private:

  int month;
  int day;
  int year;

}; // Simple Date constructor with no range checking Date::Date( int m, int d, int y ) {

  month = m;
  day = d;
  year = y;

} // Print the Date in the form mm-dd-yyyy void Date::print() { cout << month << "-" << day << "-" << year; } int main() {

  Date date1( 7, 4, 2009 ), date2;  // d2 defaults to 1/1/90
  cout << "date1 = ";
  date1.print();
  cout << "\ndate2 = ";
  date2.print();
  date2 = date1;   // assignment by default memberwise copy
  cout << "\n\nAfter default memberwise copy, date2 = ";
  date2.print();
  cout << endl;
  return 0;

}


 </source>