(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;
- }
(C++)已知String类的定义,实现其函数体的更多相关文章
- 面试题:String类通用构造,拷贝构造,析构,赋值函数实现
已知 String 类定义如下: class String { public: //通用构造函数 String(const char* str = NULL); //拷贝构造函数 String(con ...
- JAVA集合类简要笔记 - 内部类 包装类 Object类 String类 BigDecimal类 system类
常用类 内部类 成员内部类.静态内部类.局部内部类.匿名内部类 概念:在一个类的内部再定义一个完整的类 特点: 编译之后可生成独立的字节码文件 内部类可直接访问外部类私有成员,而不破坏封装 可为外部类 ...
- Java——String类中的compareTo方法总结
String类的定义: java.lang 类 String java.lang.Object java.lang.String 所有已实现的接口:Serializable, C ...
- Java修炼——String类_常用方法_常量池
String类的定义:String 是不可变字符序列 String 类的常用方法(全部都是不能改变String本身的值,都是在常量池里输出,没有改变其值) String string="ab ...
- JAVA中String类以及常量池和常用方法
一.String类的定义 String类特点:String 代表字符串.java程序中所有的字符串文字(例如:"abc")都被实现为String类的子类 String类特点:长度不 ...
- 菜鸡的Java笔记 第十三 String 类的两种实例化方法
String 类的两种实例化方法 String 类的两种实例化方式的区别 String 类对象的比较 Stirng 类对象的使用分析 /* 1.String 类的两种实例化方式的区别 ...
- String类的实现
1.在类中可以访问private成员包括两层含义:可以访问this指针的private成员:可以访问同类对象的private成员. 2.这里的String可以认为是个资源管理类,内部有个char指针, ...
- C++:string类的使用
类 <string> std::string String类的定义 , 其也是个模板类 typedef basic_string<char> string; String cl ...
- 初学杂文 String类
String: 两个字符床 String stra 和String strb stra = "hello " ; strb = "hello " 在对象池中开 ...
随机推荐
- HDU3530【STL/单调队列/RMQ】
题目链接[http://acm.hdu.edu.cn/showproblem.php?pid=3530] 题意:输入n,m,k;n代表n个点,在这n(n<100000)个点中找到最长的连续子序列 ...
- [BZOJ2431][HAOI2009]逆序对数列(DP)
从小到大加数,根据加入的位置转移,裸的背包DP. #include<cstdio> #include<cstring> #include<algorithm> #d ...
- 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 ] 给 ...
- java 环境变量设定
1 新建系统环境 新建 弹出“新建系统变量”对话框,分别输入变量名“JAVA_HOME”和变量值(java安装路径)“C:\Java\jdk1.7.0_03”,其中变量值是笔者的J ...
- [转]Eclipse 的快捷键以及文档注释、多行注释的快捷键
一.多行注释快捷键 1.选中你要加注释的区域,用ctrl+shift+C 或者ctrl+/ 会加上//注释 2.先把你要注释的东西选中,用shit+ctrl+/ 会加上/* */注释 3.以上快 ...
- 在VIEW引入CSS、JS文件
外联 CSS: <?= Html::cssFile('@web/css/ie5.css', ['condition' => 'IE 5']) ?> generates <!-- ...
- spring ioc 理解
springIOC 作用 springIOC 是sprig的特性.称作控制反转.将对象的创建,初始化,销毁,交给spring容器管理. 原理 在spring容器启动的时候,通过反射的方式,主动加载(或 ...
- 自己定义AlertDialog对话框布局
自己定义对话框中的信息body布局 LayoutInflater inflater =getLayoutInflater(); View layout = inflater.inflate(R.lay ...
- 一段js的思考
写了很久JS,还以为这段代码可以正常输出,谁知道输出超乎我的形象: <!DOCTYPE html> <html> <head> <meta charset=& ...
- Rob Pike 的 5 个编程原则
原则 1. 你没有办法预测每个程序的运行时间,瓶颈会出现在出乎意料的地方,所以在分析瓶颈原因之前,先不要盲目猜测. 原则 2. 测试(measure).在测试之前不要优化程序,即使在测试之后也要慎重, ...