// default Copy constructor where only data exist (no pointers)
#include<iostream.h>
#include<string.h>

struct node{
int nodedata;
};

class ClassName {
public:
int data;
int array[2];
char str[20];
struct node mynode;
};

int main()
{
ClassName a, b;
a.data=1;
a.array[0]=2;
a.array[1]=5;
strcpy(a.str,"hi");
a.mynode.nodedata=3;


b = a; /* normal copy ,copies all data to object b */

cout<<" copy b = a\n";
cout << "\na data " << a.data << "\t b data " << b.data;
cout << "\na array[0] " << a.array[0] << "\t b array[0] " << b.array[0];
cout << "\na array[1] " << a.array[1] << "\t b array[1] " << b.array[1];
cout << "\na str " << a.str << "\t b str " << b.str;
cout << "\na mynode "<< a.mynode.nodedata<<" \t b mynode "<< b.mynode.nodedata;

a.data =12;
a.array[0]=15;
a.array[1]=17;
strcpy(a.str,"hello");
a.mynode.nodedata=18;

cout<< "\n\n After changing the data of object a";
cout << "\na data " << a.data << "\t b data " << b.data;
cout << "\na array[0] " << a.array[0] << "\t b array[0] " << b.array[0];
cout << "\na array[1] " << a.array[1] << "\t b array[1] " << b.array[1];
cout << "\na str " << a.str << "\t b str " << b.str;
cout << "\na mynode "<< a.mynode.nodedata<<" \t b mynode "<< b.mynode.nodedata;

ClassName c=a; /* normal copy ,copies all data to object c by calling the
default copy constructor . OR we can use Class c(a); which
also calls the default copy constructor since there is no
copy constructor that you defined with prototype
Class(Class) */

cout << "\n\n copy Class c=a; OR Class c(a) will give same results\n";
cout << "\na data " << a.data << "\t c data " << c.data;
cout << "\na array[0] " << a.array[0] << "\t c array[0] " << c.array[0];
cout << "\na array[1] " << a.array[1] << "\t c array[1] " << c.array[1];
cout << "\na str " << a.str << "\t c str " << c.str;
cout << "\na mynode "<< a.mynode.nodedata<<" \t c mynode "<< c.mynode.nodedata;

a.data =7;
a.array[0]=7;
a.array[1]=7;
strcpy(a.str,"seven");
a.mynode.nodedata=7;

cout<< "\n\n After changing the data of object a";
cout << "\n\na data " << a.data << "\t c data " << c.data;
cout << "\na array[0] " << a.array[0] << "\t c array[0] " << c.array[0];
cout << "\na array[1] " << a.array[1] << "\t c array[1] " << c.array[1];
cout << "\na str " << a.str << "\t c str " << c.str;
cout << "\na mynode "<< a.mynode.nodedata<<" \t c mynode "<< c.mynode.nodedata;
}