CString类的定义如下:

class CMyString{
public:
CMyString(const char* pData=NULL);
CMyString(const CMyString& str);
CMyString& operator=(const CMyString& str);
char* getData(){return this->m_pdata;};
~CMyString(void); private:
char *m_pdata;
};

1、实现其构造函数

通用构造函数

复制构造函数

有两种方式,一种是浅拷贝,一种是深拷贝,浅拷贝就是指向已经存在的内存地址,深拷贝就是分配新空间,将数据复制过来。

浅拷贝代码:

// shallow copy
CMyString::CMyString(char* pData){
m_pdata=pData;
} CMyString::CMyString(const CMyString& str){
*this=str;
}

深拷贝代码:

CMyString::CMyString(const char* str){
if(str==NULL){
m_pdata=new char[1];
m_pdata[0]='\0';
}
else{
m_pdata=new char[strlen(str)+1];
strcpy(m_pdata,str);
}
} CMyString::CMyString(const CMyString &str){
m_pdata=new char[strlen(str.m_pdata)+1];
strcpy(m_pdata,str.m_pdata);
}

2、析构函数

CMyString::~CMyString(){
delete[] m_pdata;
}

3、赋值运算符函数

赋值运算符和复制构造函数的区别:

a. 复制构造函数生成新类对象,而赋值运算符不能,赋值运算符是用已存在的对象来创建另一个对象,给对象赋予一个新的值;

b. 由于复制构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检查源对象是否和新对象相同。而赋值运算符需要这个操作,另外赋值运算符中如果原来的对象有内存分配,要先把内存释放掉,避免内存泄露。

c. 当类中有指针类型的成员变量时,一定要重写复制构造函数和赋值运算符函数,不能使用默认的。

CMyString& CMyString::operator=(const CMyString &str){
if(this==&str)
return *this;
delete []m_pdata;
m_pdata=NULL;
m_pdata=new char[strlen(str.m_pdata)+1];
strcpy(m_pdata,str.m_pdata);
return *this;
}

4、总的代码

#include <iostream>
#include <string.h> using namespace std; class CMyString{
public:
CMyString(const char* pData=NULL);
CMyString(const CMyString& str);
CMyString& operator=(const CMyString& str);
char* getData(){return this->m_pdata;};
~CMyString(void); private:
char *m_pdata;
}; /*
// shallow copy
CMyString::CMyString(char* pData){
m_pdata=pData;
} CMyString::CMyString(const CMyString& str){
*this=str;
}
*/ // deep copy
CMyString::CMyString(const char* str){
if(str==NULL){
m_pdata=new char[1];
m_pdata[0]='\0';
}
else{
m_pdata=new char[strlen(str)+1];
strcpy(m_pdata,str);
}
} CMyString::CMyString(const CMyString &str){
m_pdata=new char[strlen(str.m_pdata)+1];
strcpy(m_pdata,str.m_pdata);
} CMyString::~CMyString(){
delete[] m_pdata;
} CMyString& CMyString::operator=(const CMyString &str){
if(this==&str)
return *this;
delete []m_pdata;
m_pdata=NULL;
m_pdata=new char[strlen(str.m_pdata)+1];
strcpy(m_pdata,str.m_pdata);
return *this;
} int main()
{
char a[]="hello";
CMyString str(a);
CMyString str1(str);
CMyString str2;
CMyString str3;
str3=str2=str;
cout << str.getData()<< endl;
cout << str1.getData()<< endl;
cout << str2.getData()<< endl;
cout << str3.getData()<< endl;
return 0;
}

(C++)已知String类的定义,实现其函数体的更多相关文章

  1. 面试题:String类通用构造,拷贝构造,析构,赋值函数实现

    已知 String 类定义如下: class String { public: //通用构造函数 String(const char* str = NULL); //拷贝构造函数 String(con ...

  2. JAVA集合类简要笔记 - 内部类 包装类 Object类 String类 BigDecimal类 system类

    常用类 内部类 成员内部类.静态内部类.局部内部类.匿名内部类 概念:在一个类的内部再定义一个完整的类 特点: 编译之后可生成独立的字节码文件 内部类可直接访问外部类私有成员,而不破坏封装 可为外部类 ...

  3. Java——String类中的compareTo方法总结

    String类的定义:    java.lang  类 String   java.lang.Object      java.lang.String 所有已实现的接口:Serializable, C ...

  4. Java修炼——String类_常用方法_常量池

    String类的定义:String 是不可变字符序列 String 类的常用方法(全部都是不能改变String本身的值,都是在常量池里输出,没有改变其值) String string="ab ...

  5. JAVA中String类以及常量池和常用方法

    一.String类的定义 String类特点:String 代表字符串.java程序中所有的字符串文字(例如:"abc")都被实现为String类的子类 String类特点:长度不 ...

  6. 菜鸡的Java笔记 第十三 String 类的两种实例化方法

    String 类的两种实例化方法 String 类的两种实例化方式的区别 String 类对象的比较 Stirng 类对象的使用分析 /*    1.String 类的两种实例化方式的区别       ...

  7. String类的实现

    1.在类中可以访问private成员包括两层含义:可以访问this指针的private成员:可以访问同类对象的private成员. 2.这里的String可以认为是个资源管理类,内部有个char指针, ...

  8. C++:string类的使用

    类 <string> std::string String类的定义 , 其也是个模板类 typedef basic_string<char> string; String cl ...

  9. 初学杂文 String类

    String: 两个字符床  String stra 和String strb stra = "hello " ; strb = "hello " 在对象池中开 ...

随机推荐

  1. SSMdemo:租房管理系统

    使用ssm框架整合,oracle数据库 框架: Spring SpringMVC MyBatis 导包: 1, spring 2, MyBatis 3, mybatis-spring 4, fastj ...

  2. POJ 1741 树分治

    题目链接[http://poj.org/problem?id=1741] 题意: 给出一颗树,然后寻找点对(u,v)&&dis[u][v] < k的对数. 题解: 这是一个很经典 ...

  3. [CSAcademy]A-Game

    题目大意: 给你一个只含字符'A'和'B'的串,A和B两人轮流对其中的子串染色,要求被染色的子串中不包含已经被染色的子串. 最后,如果一方染的'A'少,那么这一方胜: 如果双方染的'A'和'B'一样多 ...

  4. 1.4(JavaScript学习笔记) window对象的属性及方法

    一.window对象 window对象代表当前窗口,所有全局对象都是windows的属性, 例如document是window的属性,window.document.writer("&quo ...

  5. redisson实现基于业务的互斥锁

    虽然数据库有锁的实现,但是有时候对于数据的操作更需要业务层控制. 这个解决的问题有次面试被问到过,当时不知道怎么解决,乱说一通,今天也算是有个解决方案了 项目中有个需求,就是订单需要经过一层一层的审核 ...

  6. bzoj 2152

    /************************************************************** Problem: 2152 User: idy002 Language: ...

  7. bzoj 1009 DP 矩阵优化

    原来的DP: dp[i][j]表示长度为i的合法串,并且它的长度为j的后缀是给定串的长度为j的前缀. 转移: i==0 dp[0][0] = 1 dp[0][1~m-1] = 0 i>=1 dp ...

  8. CentOS 6.9/7通过yum安装指定版本的JDK/Maven

    说明:通过yum好处其实很多,环境变量不用配置,配置文件放在大家都熟悉的地方,通过rpm -ql xxx可以知道全部文件的地方等等. 一.安装JDK(Oracle JDK 1.8) # wget -- ...

  9. <摘录>CentOS怎么查看某个命令的源代码

    安装yumdownloader工具: # yum install yum-utils 设置源: [base-src] name=CentOS-5.4 - Base src - baseurl=http ...

  10. mysql中日期比较大小的方法

    假如有个表product有个字段add_time,它的数据类型为datetime,有人可能会这样写sql: select * from product where add_time = '2013-0 ...