C++基础——三大函数:拷贝构造函数、拷贝复制函数、析构函数

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39393712/article/details/94737735

需要注意的问题:
1、浅拷贝和深拷贝的区别
2、拷贝复制函数中检测自我赋值(self assignment)的作用


头文件
#ifndef PROJECT3_MYSTRING_H
#define PROJECT3_MYSTRING_H
class String
{
    //Big Three ,三个特殊函数:拷贝构造(copy ctor)、拷贝赋值(copy op=)、析构函数
public:
    String(const char* cstr = 0);//构造函数
    String(const String& str);  // 拷贝构造
    String& operator = (const String& str);//拷贝赋值
    ~String();          //析构函数,死亡的时候,析构函数就会被调动起来
    char* get_c_str() const { return m_data;} //成员函数

private:
    char* m_data;
};
// 构造函数和析构函数成对出现,构造函数动态分配内存,如果没有去掉,就发生内存泄漏,这个函数在死去之前,用析构函数,把里面的变量给删除掉;
// 构造函数
inline
String::String(const char *cstr) {
    if(cstr){
        m_data = new char[strlen(cstr) + 1];
        strcpy(m_data,cstr);
//        std::cout<<m_data<<std::endl;
    }
    else{
        m_data = new char[1];
        *m_data = '\0';
    }
}
// 拷贝构造函数
inline
String::String(const String& str)
{
    m_data = new char[strlen(str.m_data) + 1];
    strcpy(m_data, str.m_data);
}
//拷贝复制函数
inline
String& String::operator = (const String& str)
{
    if (this == &str)   //检测自我赋值(self assignment):(1)效率高,(2)如果左右指针相同,自我赋值,则会出现问题
        return *this;
    delete[] m_data;
    m_data = new char[strlen(str.m_data) + 1];
    strcpy(m_data, str.m_data);
    return *this;
}

//#include<iostream>
//ostream& operator<<(ostream& os, const String& str)
//{
//    os << str.get_c_str();
//    return os;
//}
// 析构函数
inline
String::~String() {
    delete[] m_data;
}
#endif //PROJECT3_MYSTRING_H

主函数

#include <iostream>
#include <string>
#include "mystring.h"
using namespace std;
int main()
{
    String a("hello111");//构造函数
    String b("world");
    String c(a);  //拷贝构造
    b = a;//拷贝赋值函数
    cout<<a.get_c_str();
//    String* p = new String("hello");
//    delete p;
//    String s3(s1); //拷贝构造
//    cout << c <<endl;
//    s3 = s2;  //拷贝赋值
    return 0;
}
展开阅读全文

没有更多推荐了,返回首页