C++类设计2(Class with pointer members)


二 Class with pointer members(Class String)

1. 测试代码(使用效果)

int main()
{
    String s1(),
    String s2("hello");          //构造函数
    String s3(s1);               //拷贝构造
    cout << s3 << endl;
    s3 = s2;                     //拷贝赋值
    cout << s3 << endl;
}

2 Big three(三种特殊函数)

class String
{
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; 
};

2.1 ctor & dtor(构造与析构)

inline
String::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';
    }
}

inline
String::~String()
{
    delete[] m_data;
} 

2.2 Class with pointer members必须有copy ctor(拷贝构造)和copy op(拷贝赋值)

深拷贝与浅拷贝

深拷贝:

inline
String::String(const String& str){
    m_data = new char[strlen(str.m_data) + 1];  //直接取得另一个对象的private数据
                                                //可用友元解释 
    strcpy(m_data, str.m_data);
}

拷贝赋值函数:

思路:若右边拷贝到左边,步骤为 清空左边;分配与右边相同空间;完成拷贝。

inline
String& 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
} 

总结:有指针变量的类,一定要重新其拷贝构造,拷贝赋值和析构函数!

优质内容筛选与推荐>>
1、微信公众号发送客服消息提示errcode":45015,"errmsg":"response out of time limit or subscription is canceled hint:解决办法【已解决】
2、Dubbo基础、高级讲解
3、Visual Studio 调试系列2 基本调试方法
4、POJ 跳蚤
5、测试流程


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号