在这次的实验中我主要遇到了两个问题,首先是动态内存分配中的delete出错,经过检查发现是构造函数中的内存分配忘记加上1
代码
1 | String::String(const String&Str) |
第二处内存分配错误的地方是重载加号运算符的位置,由于我之前的代码是用this先创建了一个String的对象,这时就已经分配的内存,在用strcat连接Str时就会因为分配空间不足造成内存泄露。
出错代码
1 | String String::operator+(const String& Str) |
改进方法是直接创建一个char*的指针,一开始就用Str和this分配内存再连接,最后返回一个无名临时对象,但是需要注意的是,这里不能够返回引用,因为在离开这个歌作用域后,这个无名临时对象就会被销毁
改进代码
1 | String String::operator+(const String& Str)//不能返回引用 |
第二个问题
在下标运算符的重载
我最开始的代码时返回一个指针来修改,但是我发现在类中的数据成员不能在类外通过指针修改。况且返回一个地址也不符合下标运算符的普遍结果,那么返回什么呢?应该返回他的引用。这样就可以知道他的值又能修改他的值。
改进代码
1 | char& String::operator[](int index) |
=============
= [] () ->必须重载为成员函数
<< >> 必须重载位全局函数
< > == += + - 可以任意重载
‘.’ ‘.*’ ‘?:’ ‘,’ ‘&’ ‘&&’ ‘||’ ‘sizeof’ 都不允许被重载
=============
实验完整代码
String.h
1 | #ifndef _STRING_H_ |
String.cpp
1 |
|
main.cpp
1 | #include <iostream> |
本文作者: jiangyuhao
本文链接: http://example.com/2022/04/14/4%E6%9C%8814%E6%97%A5%E5%AE%9E%E9%AA%8C%E6%80%BB%E7%BB%93/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
![]()