【侯捷P9】String类的拷贝构造、拷贝赋值、析构函数

头文件

P9.h

#ifndef __P9__
#define __P9__

#include <iostream>
#include<cstring>

using namespace std;
// class with pointer number

class String
{
private:
    /* data */
char* m_data;                                   // 动态分配 一个指针是 4 byte
public:
    String(const char* cstr=0 );                // 构造函数  设置默认值 只能在声明中有默认值
    String(const String& str);                  // 拷贝构造函数
    String& operator=(const String& str);       // 拷贝赋值函数  只要返回的不是local object就可以传引用
    ~String();                                  // 析构函数
    char* get_c_char() const;                   // 把这个函数声明为const成员函数
    // char* m_pub;                             // 测试用
};

inline
String::String(const char* cstr )               // 构造函数的默认值不能出现在定义中
{
    std::cout<<"构造"<<endl;
    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(const String& str) 
{
    cout<<"拷贝构造"<<endl;
    m_data=new char[strlen(str.m_data)+1];              // 开辟空间
    strcpy(m_data,str.m_data);   // 拷贝
}

// 拷贝赋值函数 --是一个类成员函数
inline
String& String::operator=(const String& str)
{   
    cout<<"拷贝赋值"<<endl;
    // 检测
    if(this==&str){
        return *this;
    }

    // 赋值
    delete[] m_data;
    m_data=new char[strlen(str.m_data)+1];
    return *this;
}

inline
String::~String()
{   
    cout<<"析构函数"<<endl;
    delete[] m_data;
}

inline char*
String::get_c_char() const
{   
    return this->m_data;
}

// 输出字符串
inline ostream& 
operator<<(ostream& os,const String& str)   // const 对象不能访问非const成员函数
                                            // 这里的str是const对象,只能访问const的成员函数    
{
    os<<str.get_c_char();
    return os;
}


// // 输出字符串
// // 直接const成员变量访问成员变量
// inline ostream& 
// operator<<(ostream& os,const String& str)
// {
//     os<<str.m_pub<<endl;
// }

#endif

cpp文件

P9.cpp

#include "P9.h"

int main(int argc, char const *argv[])
{
    String str1("Hello");  //构造函数
    String str2; // 构造函数       // 定义(实现)中不能设置默认值
    cout<<"str1:"<<str1<<endl;
    String str3(str1); // 拷贝构造
    String str_test=str1;  // 拷贝构造
    str2=str1;  // 拷贝赋值
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tech沉思录

点赞加投币,感谢您的资瓷~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值