头文件
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;
}