CString类的定义如下:

  1. class CMyString{
  2. public:
  3. CMyString(const char* pData=NULL);
  4. CMyString(const CMyString& str);
  5. CMyString& operator=(const CMyString& str);
  6. char* getData(){return this->m_pdata;};
  7. ~CMyString(void);
  8.  
  9. private:
  10. char *m_pdata;
  11. };

1、实现其构造函数

通用构造函数

复制构造函数

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

浅拷贝代码:

  1. // shallow copy
  2. CMyString::CMyString(char* pData){
  3. m_pdata=pData;
  4. }
  5.  
  6. CMyString::CMyString(const CMyString& str){
  7. *this=str;
  8. }

深拷贝代码:

  1. CMyString::CMyString(const char* str){
  2. if(str==NULL){
  3. m_pdata=new char[1];
  4. m_pdata[0]='\0';
  5. }
  6. else{
  7. m_pdata=new char[strlen(str)+1];
  8. strcpy(m_pdata,str);
  9. }
  10. }
  11.  
  12. CMyString::CMyString(const CMyString &str){
  13. m_pdata=new char[strlen(str.m_pdata)+1];
  14. strcpy(m_pdata,str.m_pdata);
  15. }

2、析构函数

  1. CMyString::~CMyString(){
  2. delete[] m_pdata;
  3. }

3、赋值运算符函数

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

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

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

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

  1. CMyString& CMyString::operator=(const CMyString &str){
  2. if(this==&str)
  3. return *this;
  4. delete []m_pdata;
  5. m_pdata=NULL;
  6. m_pdata=new char[strlen(str.m_pdata)+1];
  7. strcpy(m_pdata,str.m_pdata);
  8. return *this;
  9. }

4、总的代码

  1. #include <iostream>
  2. #include <string.h>
  3.  
  4. using namespace std;
  5.  
  6. class CMyString{
  7. public:
  8. CMyString(const char* pData=NULL);
  9. CMyString(const CMyString& str);
  10. CMyString& operator=(const CMyString& str);
  11. char* getData(){return this->m_pdata;};
  12. ~CMyString(void);
  13.  
  14. private:
  15. char *m_pdata;
  16. };
  17.  
  18. /*
  19. // shallow copy
  20. CMyString::CMyString(char* pData){
  21. m_pdata=pData;
  22. }
  23.  
  24. CMyString::CMyString(const CMyString& str){
  25. *this=str;
  26. }
  27. */
  28.  
  29. // deep copy
  30. CMyString::CMyString(const char* str){
  31. if(str==NULL){
  32. m_pdata=new char[1];
  33. m_pdata[0]='\0';
  34. }
  35. else{
  36. m_pdata=new char[strlen(str)+1];
  37. strcpy(m_pdata,str);
  38. }
  39. }
  40.  
  41. CMyString::CMyString(const CMyString &str){
  42. m_pdata=new char[strlen(str.m_pdata)+1];
  43. strcpy(m_pdata,str.m_pdata);
  44. }
  45.  
  46. CMyString::~CMyString(){
  47. delete[] m_pdata;
  48. }
  49.  
  50. CMyString& CMyString::operator=(const CMyString &str){
  51. if(this==&str)
  52. return *this;
  53. delete []m_pdata;
  54. m_pdata=NULL;
  55. m_pdata=new char[strlen(str.m_pdata)+1];
  56. strcpy(m_pdata,str.m_pdata);
  57. return *this;
  58. }
  59.  
  60. int main()
  61. {
  62. char a[]="hello";
  63. CMyString str(a);
  64. CMyString str1(str);
  65. CMyString str2;
  66. CMyString str3;
  67. str3=str2=str;
  68. cout << str.getData()<< endl;
  69. cout << str1.getData()<< endl;
  70. cout << str2.getData()<< endl;
  71. cout << str3.getData()<< endl;
  72. return 0;
  73. }

(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. HDU3530【STL/单调队列/RMQ】

    题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=3530] 题意:输入n,m,k;n代表n个点,在这n(n<100000)个点中找到最长的连续子序列 ...

  2. [BZOJ2431][HAOI2009]逆序对数列(DP)

    从小到大加数,根据加入的位置转移,裸的背包DP. #include<cstdio> #include<cstring> #include<algorithm> #d ...

  3. The 2016 ACMICPC Asia Beijing Regional Contest

    A. Harmonic Matrix Counter (3/19) B. Binary Tree (1/14) C. Asa's Chess Problem (21/65) [ Problem ] 给 ...

  4. java 环境变量设定

    ​     1   新建系统环境  新建  弹出“新建系统变量”对话框,分别输入变量名“JAVA_HOME”和变量值(java安装路径)“C:\Java\jdk1.7.0_03”,其中变量值是笔者的J ...

  5. [转]Eclipse 的快捷键以及文档注释、多行注释的快捷键

    一.多行注释快捷键 1.选中你要加注释的区域,用ctrl+shift+C 或者ctrl+/ 会加上//注释 2.先把你要注释的东西选中,用shit+ctrl+/ 会加上/*    */注释 3.以上快 ...

  6. 在VIEW引入CSS、JS文件

    外联 CSS: <?= Html::cssFile('@web/css/ie5.css', ['condition' => 'IE 5']) ?> generates <!-- ...

  7. spring ioc 理解

    springIOC 作用 springIOC 是sprig的特性.称作控制反转.将对象的创建,初始化,销毁,交给spring容器管理. 原理 在spring容器启动的时候,通过反射的方式,主动加载(或 ...

  8. 自己定义AlertDialog对话框布局

    自己定义对话框中的信息body布局 LayoutInflater inflater =getLayoutInflater(); View layout = inflater.inflate(R.lay ...

  9. 一段js的思考

    写了很久JS,还以为这段代码可以正常输出,谁知道输出超乎我的形象: <!DOCTYPE html> <html> <head> <meta charset=& ...

  10. Rob Pike 的 5 个编程原则

    原则 1. 你没有办法预测每个程序的运行时间,瓶颈会出现在出乎意料的地方,所以在分析瓶颈原因之前,先不要盲目猜测. 原则 2. 测试(measure).在测试之前不要优化程序,即使在测试之后也要慎重, ...