前言
关于侯捷老师的c++教学视频string类部分的要点总结和代码分享。
一、几点总结
-
1.有指针对象的类,要浅拷贝和深拷贝的问题,避免发生内存泄漏和野指针问题,要自己写构造函数(new)和析构函数(delete)
-
2.拷贝赋值( = ),要检测自我复制(self assignment) ,否则在delete自己的时候会造成错误。
-
3.new的过程
Complex* pc =new Complex(1,2);
编译器转化为:
Complex* pc;
void* mem = operator new( sizeof(Complex) ); //分配内存(内部调用malloc(n) )
pc = static_cast<Complex*>(mem); //转型
pc->Complex::Complex(1,2); //构造函数
-
4.delete的过程
String* ps = new String(“Hello”); ... delete ps;
编译器转化为:
String::~String(ps); //析构函数
operator delete(ps); //释放内存(内部调用free(n) )
二、String类代码(本人自己编写)
1.String.h
#include <iostream>
#include <string.h>
using namespace std;
#ifndef _MYSTRING_H_
#define _MYSTRING_H_
class MyString {
public:
MyString(const char* cstr = 0);
MyString(const MyString& str);
MyString& operator = (const MyString& str);
~MyString();
char* get_str() const {
return m_data;
}
private:
char *m_data;
};
#endif //_MYSTRING_H_
2.String.cpp
由于编译器原因,该部分函数没有加inline
#include "MyString.h"
MyString::MyString(const char* cstr){
if (cstr) {
m_data = new char[strlen(cstr) + 1];
strcpy(m_data, cstr);
} else {
m_data = new char[1];
*m_data = '\0';
}
}
MyString::MyString(const MyString& str){
m_data = new char[strlen(str.m_data) + 1];
strcpy(m_data, str.m_data);
}
MyString& MyString::operator = (const MyString& str){
if (this == &str) {
return *this;
}
delete[] m_data;
m_data = new char[strlen(str.m_data) + 1];
strcpy(m_data, str.m_data);
return *this;
}
MyString::~MyString(){
delete[] m_data;
}
3.main.cpp
#include <iostream>
#include "MyString.h"
using namespace std;
inline ostream& operator << (ostream& os, const MyString& str){
return os << str.get_str();
}
int main() {
char s[]="abc";
MyString s1(s);
MyString s2(s1);
s1=s2;
cout<<s1<<endl;
return 0;
}