从C到C++(二)
2016-12-11 20:51
155 查看
http://blog.csdn.net/lwbeyond/article/details/6202256
楼上是关于拷贝函数的介绍↑
析构函数
当类中涉及到动态内存时,该函数如图构造函数一样很重要。
复制构造函数
特别涉及到指针时,要自己定义复制构造函数。
在学习中的总结:
1.char*a="dadd";
strlen (a)=4 可见不包括字符串的\0
cout<<a 输出dadd 可见此两处a代表dadd
2.在析构函数里加上delete以删除new的动态内存
但是如果你把类的地址给一个指针,并用new给他分配内存,你就不能指望析构函数了,必须用delete把这个指针消除
3.如果两个类中都有一个指向字符串的指针a,则使用默认复制构造函数时,两个类的a指向同一片内存,这就危险了。
因此我们必须自己构造复制函数
CBox(const CBox &CBox1)
{
a=new char[strlen(CBox1.a)+1];
strcpy(a,CBox1.a);
}
这样以来他们就独立了
4.如果你认为,你没有使用一个类给另一个类赋值这样的操作,因此想减去麻烦,那你就错了,如果不遇到指针还好,遇到了,就很麻烦了。
比如上面的类CBox,包含指针a
定义一个函数
void display(CBox box1)
{
cout<<a;
}
CBox box;
display(box);
如果我们使用默认复制构造函数,那么在调用display时,box的指针a会复制给box1的a,那么两个类的a指向一个内存的情况,
就这样,没有一点点防备,也没有一丝顾虑地出现在你的世界里了,当你display完了之后,系统很天真地把box1这个形参给销毁,也就把
a指向的内存也释放了,这个时候你原来box的a就指向一个不被保护的内存,随时可能被其他东西占用,这就跟你发现你住了几十年的房子
没有房产证,而这个时候政府就要拆迁了一样。呵呵。。。好玩不。
void display(CBox box1)
{
cout<<a;
}
楼上是关于拷贝函数的介绍↑
析构函数
当类中涉及到动态内存时,该函数如图构造函数一样很重要。
复制构造函数
特别涉及到指针时,要自己定义复制构造函数。
在学习中的总结:
1.char*a="dadd";
strlen (a)=4 可见不包括字符串的\0
cout<<a 输出dadd 可见此两处a代表dadd
2.在析构函数里加上delete以删除new的动态内存
但是如果你把类的地址给一个指针,并用new给他分配内存,你就不能指望析构函数了,必须用delete把这个指针消除
3.如果两个类中都有一个指向字符串的指针a,则使用默认复制构造函数时,两个类的a指向同一片内存,这就危险了。
因此我们必须自己构造复制函数
CBox(const CBox &CBox1)
{
a=new char[strlen(CBox1.a)+1];
strcpy(a,CBox1.a);
}
这样以来他们就独立了
4.如果你认为,你没有使用一个类给另一个类赋值这样的操作,因此想减去麻烦,那你就错了,如果不遇到指针还好,遇到了,就很麻烦了。
比如上面的类CBox,包含指针a
定义一个函数
void display(CBox box1)
{
cout<<a;
}
CBox box;
display(box);
如果我们使用默认复制构造函数,那么在调用display时,box的指针a会复制给box1的a,那么两个类的a指向一个内存的情况,
就这样,没有一点点防备,也没有一丝顾虑地出现在你的世界里了,当你display完了之后,系统很天真地把box1这个形参给销毁,也就把
a指向的内存也释放了,这个时候你原来box的a就指向一个不被保护的内存,随时可能被其他东西占用,这就跟你发现你住了几十年的房子
没有房产证,而这个时候政府就要拆迁了一样。呵呵。。。好玩不。
void display(CBox box1)
{
cout<<a;
}
相关文章推荐
- C++ FAQ Lite[8]--引用(更新)
- 开发工具大比拚之Visual C++ vs. Delphi(三)
- 开发工具大比拚之Visual C++ vs. Delphi(二)
- 开发工具大比拚之Visual C++ vs. Delphi(一)
- Byte杂志C++调查报告
- 对今年内将出版的几本C++书的简评
- VC不是梦想,C++需要自由的心
- C++之父B. Stroustrup近期言论
- 用纯粹的C++编写COM组件
- C++中建立对象间消息连接的一种系统方法
- 在Delphi与C++之间实现函数与对象共享
- C/C++的思索 C++之父访谈录 [上帝的玩笑吗?]
- 突破C++的虚拟指针--C++程序的缓冲区溢出攻击
- C++: BIG5到GB
- 浅谈C++中运算符重载
- C++ FAQ Lite[13]--算符重载(新)
- C++ FAQ Lite[7]--类和对象(更新)
- C++ FAQ Lite[17]--异常和错误处理(更新)
- C++ FAQ Lite[9]--内联函数(更新)