string的四个函数--构造、析构、拷贝、赋值
来源:互联网 发布:家里蹲 知乎 编辑:程序博客网 时间:2024/06/06 05:30
// String的普通构造函数
{
}
// String的析构函数
{
// 由于m_data是内部数据类型,也可以写成 delete m_data;
不要轻视拷贝构造函数与赋值函数
u
现将a赋给b,缺省赋值函数的“位拷贝”意味着执行b.m_data = a.m_data。这将造成三个错误:一是b.m_data原有的内存没被释放,造成内存泄露;二是b.m_data和a.m_data指向同一块内存,a或b任何一方变动都会影响另一方;三是在对象被析构时,m_data被释放了两次。
u
String a(“hello”);
String b(“world”);
String c = a;
c = b; // 调用了赋值函数
本例中第三个语句的风格较差,宜改写成String c(a) 以区别于第四个语句。
类String的拷贝构造函数与赋值函数
// 允许操作other的私有成员m_data
}
// 赋值函数
}
(1)第一步,检查自赋值。你可能会认为多此一举,难道有人会愚蠢到写出 a = a 这样的自赋值语句!的确不会。但是间接的自赋值仍有可能出现,例如
// 内容自赋值
b = a;
…
c = b;
…
a = c;
// 地址自赋值
b = &a;
…
a = *b;
也许有人会说:“即使出现自赋值,我也可以不理睬,大不了化点时间让对象复制自己而已,反正不会出错!”
他真的说错了。看看第二步的delete,自杀后还能复制自己吗?所以,如果发现自赋值,应该马上终止函数。注意不要将检查自赋值的if语句
if(this == &other)
错写成为
(2)第二步,用delete释放原有的内存资源。如果现在不释放,以后就没机会了,将造成内存泄露。
(3)第三步,分配新的内存资源,并复制字符串。注意函数strlen返回的是有效字符串长度,不包含结束符‘\0’。函数strcpy则连‘\0’一起复制。
(4)第四步,返回本对象的引用,目的是为了实现象 a = b = c 这样的链式表达。注意不要将 return *this 错写成 return this 。那么能否写成return other 呢?效果不是一样吗?
不可以!因为我们不知道参数other的生命期。有可能other是个临时对象,在赋值结束后它马上消失,那么return other返回的将是垃圾。
- string的四个函数--构造、析构、拷贝、赋值
- 编写String类的构造、析构、赋值和拷贝构造函数
- 类的构造、析构、拷贝、赋值函数
- string类的构造函数,析构函数,拷贝构造函数和赋值构造函数
- String构造函数 拷贝构造函数 析构函数 赋值构造函数的实现
- 类的构造、析构、赋值构造、拷贝构造函数
- string函数的构造函数,析构函数,拷贝构造,赋值构造
- String的构造函数,拷贝构造函数、析构函数和赋值函数
- string类的构造函数,拷贝构造函数,析构函数和赋值函数
- String类的构造函数,析构函数,拷贝构造函数和赋值函数
- 类String的 构造函数、拷贝构造函数、析构函数、赋值函数实现
- string类的构造函数,拷贝构造函数,析构函数和赋值函数
- 编写String类的普通构造函数、拷贝构造函数、析构函数、赋值函数
- 编写类String的构造函数、拷贝构造函数、析构函数、赋值函数
- 编写String类的构造函数、析构函数、拷贝构造函数、赋值函数
- 编写类String的构造函数、拷贝构造函数、析构函数和赋值函数
- string类的构造函数、析构函数、拷贝构造函数和赋值函数
- 编写类String 的构造函数、拷贝构造函数、析构函数和赋值函数
- java笔记
- Windows下后缀为*.zip.001文件的解压方法[转]
- SQL语句的解析过程
- Android提高第十一篇之模拟信号示波器
- Qt写串口通讯软件,开始乱码,打开串口调试助手后又能正常接收
- string的四个函数--构造、析构、拷贝、赋值
- 设计模式--抽象工厂,与生活结合
- 递归遍历目录文件
- 关于block的一个奇怪问题
- 一些简单的设备驱动函数
- linux ipc—FIFO
- org.json.JSONObject的optXXX方法
- 在iOS中使用静态库
- win7 ubuntu 双系统 安装