0
点赞
收藏
分享

微信扫一扫

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


目录

  • ​​头文件​​
  • ​​cpp文件​​

头文件

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 条评论