C++显式复制构造函数

来源:互联网 发布:国际阿里云价格 编辑:程序博客网 时间:2024/06/06 05:45
test.hclass A{private:int len;char * str;public:A();A(const char * s);~A();//友元  重载 <<操作friend std::ostream & operator <<(std::ostream & os,const A& a);}
test.cpp#include"test.h"#incldue<cstring>A(){len=4;str=new char [len+1];std::strcpy(str,"C++");}A(const char *s){len=std::strlen(s);str=new char[len+1];std::strcpy(str,s);}~A(){delete []str;}
std::ostream & operator <<(std::ostream & os,const A& a)
{os<<a.str<<endl;}
//测试user.cpp#include"test.h"void display(A a);int main(){A a("hello");std::cout<<a;//输出:hellodisplay(a);//调用方法..方法里面输出 hellostd::cout<<a;//输出乱码????????  输出乱码是因为,在display函数调用的时候..参数a是值传递,,所以调用 了A类的隐式的复制构造函数//这个构造函数//内部工作原理:// aa.len=a.len// aa.str=a.str  这句话..是把str的地址赋值给了aa.str所以,他们指向的同一个字符串地址, 在display函数结束后,aa参数消失,调用析构//函数释放aa.str ,因为a.str与a.str地址一样.所以把a.str也释放了,所以就出现 了..乱码要改进..则需要加入显式的复制构造函数
return 0;}void display(A aa){std::cout<<aa<<endl;}//首先在test.h中加入A(const A & a);test.cpp中加入A:A(const A & a){len=a.len;str=new char[len+1];std::strcpy(str,a.str);}这样显示复制字符串..而不是地址

新建 一个对象并将其初始化为同类现有对象时,复制构造函数都被调用.如:假设 at是A的一个对象A a1(at);A a1=a;A a1=A(a);A *p=new A(at)
赋值=与复制构造函数一样
A a A a(1) A a=1 构造函数
A a(1) A a1=a 复制构造函数
	
				
		
原创粉丝点击