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 复制构造函数