C++显式复制构造函数

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




                
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值