(C++)已知String类的定义,实现其函数体

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;
}
时间: 2024-10-26 01:33:20

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

【小白的java成长系列】——String类的深入分析(基于源码)

接着前面面向对象来说吧~今天来说说String类..其实String类也包含很多面向对象的知识的~ 首先来问一个问题:我们在开发过程中,如果要使用一个类的话,就要创建对象,这句话没什么问题吧~在实际开发的时候确实是这样的,只有创建了对象才能真正的去使用一个普通的类,我们一般创建对象,几乎所有的类创建对象都是要通过new关键字来创建的~ 问题就来了..为什么我们的String可以直接写成String str = "abc";这样子呢? 当然String类也可以通过new来创建对象的...

JAVA中String类

1.String类定义的变量是不可变得 eg:String s0="kvill"; String s1 = new String("kvill"); 为什么要设计为不可变: 1.1 字符串常量池的需要 1.2允许String对象缓存HashCode Java中String对象的哈希码被频繁地使用, 比如在hashMap 等容器中. 字符串不变性保证了hash码的唯一性,因此可以放心地进行缓存.这也是一种性能优化手段,意味着不必每次都去计算新的哈希码. 在String

Coding之路——重新学习C++(6):一个String类

这个String类是对运算符重载和以前知识的一个综合应用,提供了值语义.字符串读写.检查和不检查的访问.流I/O和字符串拼接等功能. 1.String类的定义 class String{ //类型的定义 struct Srep; //表示能被几个同样值的String共享 Srep *rep; public: class Cref; //实现下标运算,区别对待读操作和写操作 class Range(); //范围错误时抛出的异常 //构造.赋值和析构函数 String(); //x = "&quo

java中String类为什么不可变?

在面试中经常遇到这样的问题:1.什么是不可变对象.不可变对象有什么好处.在什么情景下使用它,或者更具体一点,java的String类为什么要设置成不可变类型? 1.不可变对象,顾名思义就是创建后的对象不可以改变,典型的例子有java中的String类型. 2.相比于可变对象,不可变对象有很多优势: (1)不可变对象可以提高String Pool(字符串常量池)的效率和安全性.如果你知道一个对象是不可变动 ,那么需要拷贝的对象的内容时就不用复制它本身二只是复制它的地址,复制地址(通常一个指针的大小

String类常用方法源码分析

环境:JDK8 主要分析String类的一些常用的方法源码. String 先看String类的定义: public final class String    implements java.io.Serializable, Comparable<String>, CharSequence 可以看到String类被final修饰,因此不能被继承.String类还实现了序列化接口Serializable.可比较的接口Comparable并指定范型为String,该接口必须要实现int comp

C++ string类相关函数

1.简介 string 类是 STL 中 basic_string 模板实例化得到的模板类.其定义如下: typedef basic_string <char> string; basic_string 此处可以不必深究. string 类的成员函数有很多,同一个名字的函数也常会有五六个重载的版本.这里仅对常用成员函数按功能进行分类,并直接给出应用的例子,通过例子,可以基本掌握这些成员函数的用法. 2.函数 2.1 构造函数 string 类有多个构造函数,用法示例如下: string s1(

Java知多少(18)类的定义及其实例化

类必须先定义才能使用.类是创建对象的模板,创建对象也叫类的实例化. 下面通过一个简单的例子来理解Java中类的定义: 1 public class Dog{ 2 String name; 3 int age; 4 5 void bark(){ // 汪汪叫 6 System.out.println("汪汪,不要过来"); 7 } 8 9 void hungry(){ // 饥饿 10 System.out.println("主人,我饿了"); 11 } 12 } 对

Java集合-5. (List)已知有一个Worker 类如下: 完成下面的要求 1) 创建一个List,在List 中增加三个工人,基本信息如下: 姓名 年龄 工资 zhang3 18 3000 li4 25 3500 wang5 22 3200 2) 在li4 之前插入一个工人,信息为:姓名:zhao6,年龄:24,工资3300 3) 删除wang5 的信息 4) 利用for 循

第六题 5. (List)已知有一个Worker 类如下: public class Worker { private int age; private String name; private double salary; public Worker (){} public Worker (String name, int age, double salary) { this.name = name; this.age = age; this.salary = salary; } public

输出所有希腊字符(char类型和int类型转换练习) 已知:开始字符 &#39;α&#39; 和 结束字符&#39;ω&#39;

输出所有希腊字符(char类型和int类型转换练习) 已知:开始字符 'α' 和 结束字符'ω' package homework0702; public class Alphabet { public static void main(String[] args) { System.out.println("作者:王飞,郑州大学,兴唐教育"); System.out.println("该结构用于 希腊字母,欢迎使用\n"); System.out.println(