test.h
class 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;//输出:hello
display(a);//调用方法..方法里面输出 hello
std::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 复制构造函数