#include <iostream>
using namespace std;
class Location
{
private :
int X;
int Y;
public:
Location(int xx=0,int yy=0)
{
X=xx;
Y=yy;
cout<<"constructor "<<endl;
}
Location(const Location& p) {
X=p.X;
Y=p.Y;
cout<<"Copy_Constructor"<<endl;
}
~Location()
{
cout<<X<<","<<Y<<"Object Destory"<<endl;
}
int GetX()
{
return X;
}
int GetY()
{
return Y;
}
};
void f(Location p)
{
cout<<"Function:"<<p.GetX()<<","<<p.GetY()<<endl;
}
void mainPlay()
{
Location A(1,2);
f(A);
}
void main11()
{
mainPlay();
system("pause");
}
下面是有问题的示例:
</pre><pre name="code" class="cpp">#include <iostream>
using namespace std;
class name
{
public:
name(char *pn);
~name();
protected:
char *pname;
int size;
};
name::name(char *pn)
{
cout<<"Constructing"<<pn<<endl;
pname=(char*)malloc(strlen(pn)+1);
if(pname!=NULL)
{
strcpy(pname,pn);
}
size=strlen(pn);
}
name::~name()
{
cout<<""<<pname<<endl;
pname[0]='\0';
free(pname);
size=0;
}
void playmain()
{
name obj1("name1");
name obj2=obj1;
}
void main()
{
playmain();
system("pause");
}
<pre name="code" class="cpp">
#include <iostream>
using namespace std;
class name
{
public:
name(char *pn);
name( name&obj)
{
cout<<"copy constructing"<<endl;
char *pn=obj.getPn();
pname=(char*)malloc(strlen(pn)+1);
if(pname!=NULL)
{
strcpy(pname,pn);
size=strlen(pn);
}
}
~name();
char* getPn()
{
return pname;
}
void operator=(name &obj1)
{
cout<<"operator ="<<endl;
char *pn=obj1.getPn();
pname=(char*)malloc(strlen(pn)+1);
if(pname!=NULL)
{
strcpy(pname,pn);
size=strlen(pn);
}
pname[0]='x';
}
protected:
char *pname;
int size;
};
name::name(char *pn)
{
cout<<"Constructing"<<endl;
pname=(char*)malloc(strlen(pn)+1);
if(pname!=NULL)
{
strcpy(pname,pn);
}
size=strlen(pn);
}
name::~name()
{
cout<<"析构"<<endl;
pname[0]='\0';
free(pname);
size=0;
}
void playmain()
{
name obj1("name1");
//如果你不重写拷贝构造函数,那么c++ 编译器会给我们提供一个默认的copy 狗狗在函数(浅copy)
name obj2=obj1;
//如果你不写=操作,那么c++ 编译器会给我们提供一个默认的copy 狗狗在函数(浅copy)
obj2=obj1;//会调用obj2 的=操作
cout<<obj2.getPn()<<endl;
}
void main()
{
playmain();
system("pause");
}
以上程序从内存的角度看还是有严重bug.
#include <iostream>
using namespace std;
class name
{
public:
name(char *pn);
name( name&obj)
{
cout<<"copy constructing"<<endl;
char *pn=obj.getPn();
pname=(char*)malloc(strlen(pn)+1);
if(pname!=NULL)
{
strcpy(pname,pn);
size=strlen(pn);
}
}
~name();
char* getPn()
{
return pname;
}
void operator=(name &obj1)
{
cout<<"operator ="<<endl;
char *pn=obj1.getPn();
if(pname!=NULL)
{
free(pname);
pname=NULL;
size=0;
}
pname=(char*)malloc(strlen(pn)+1);
if(pname!=NULL)
{
strcpy(pname,pn);
size=strlen(pn);
}
pname[0]='x';
}
protected:
char *pname;
int size;
};
name::name(char *pn)
{
cout<<"Constructing"<<endl;
pname=(char*)malloc(strlen(pn)+1);
if(pname!=NULL)
{
strcpy(pname,pn);
}
size=strlen(pn);
}
name::~name()
{
cout<<"析构"<<endl;
pname[0]='\0';
free(pname);
size=0;
}
void playmain()
{
name obj1("name1");
name obj3("name3");
//如果你不重写拷贝构造函数,那么c++ 编译器会给我们提供一个默认的copy 狗狗在函数(浅copy)
name obj2=obj1;
//如果你不写=操作,那么c++ 编译器会给我们提供一个默认的copy 狗狗在函数(浅copy)
obj2=obj3;// 会调用obj2 的等号操作函数 obj3 是形参,obj2 干什么去了?
cout<<obj2.getPn()<<endl;
}
void main()
{
playmain();
system("pause");
}