/**作者: cwl内容:带指针类的注意点c++构造函数,拷贝构造,拷贝赋值new delete解析*/
#include using namespace std;class String {
public:String(const char* cstr = 0) {if(cstr) {m_data = new char[strlen(cstr) + 1];strcpy(m_data, cstr);} else {m_data = new char[1];*m_data = '\0';}}///拷贝构造,接受自己这种东西的引用String(const String& str) {m_data = new char[strlen(str.m_data) + 1];strcpy(m_data, str.m_data);}///拷贝赋值,接受自己这种东西的引用String& operator=(const String &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;}~String() {delete[] m_data;}char* get_c_str() const {return m_data;}
private:char* m_data;
};inline ostream&
operator <<(ostream& os, const String &str) {os <}int main() {/**c&#43;&#43;中类四个重要部分构造函数析构函数拷贝构造拷贝赋值*////[1] 如果你的class如果带着指针&#xff0c;就必须重写拷贝构造和拷贝赋值/**构造和析构是带指针的类必备的&#xff0c;而容易被忽略的是下面两个部分。【1.1】拷贝构造String(const String& str) {m_data &#61; new char[strlen(str.m_data) &#43; 1];strcpy(m_data, str.m_data);}可能会有疑问&#xff0c;str中的m_data明明是private为什么能直接访问&#xff1f;答&#xff1a;解释有很多&#xff0c;其中一个是一个类的不同对象互为友元【1.2】拷贝赋值String& operator&#61;(const String &str) {if(this &#61;&#61; &str) {return *this;}delete[] m_data;m_data &#61; new char[strlen(str.m_data) &#43; 1];strcpy(m_data, str.m_data);return *this;}杀掉原来的&#xff0c;创建一个同大小的空间&#xff0c;返回。细节是要检测是否是检测自我赋值。if(this &#61;&#61; &str) {return *this;}多想一步&#xff0c;加强代码稳定性。下面我们添加输出inline ostream&operator <<(ostream& os, const String &str) {os <(mem); 类型转化pc->String::String("asd"); 调用构造函数&#xff0c;直接调会有问题&#xff0c;这里只是示例*////【delete】delete的过程/// String::~String(ps) //析构函数/// operator delete(ps) //释放内存/**new 和 delete 底层使用malloc和delete获得空间*/return 0;
}