【15】实现一个MyString类

题目:实现一个MyString类,类的声明如下

//MyString函数的实现
class MyString{
public:
	MyString(char *pData = NULL);
	MyString(const MyString &string);
    MyString& operator=(const MyString &string);
	~MyString();
private:
	char *m_dada;
};

实现如下

//实现构造函数
MyString::MyString(char *pData){
	if(pData == NULL){
	    return;
	}
	else{
	    int len = strlen(pData);
	    this->m_dada = new char[len+1];
	    strcpy(this->m_dada, pData);
	}
}

//实现拷贝构造函数
MyString::MyString(const MyString &string){
	int len = strlen(string.m_dada);
	this->m_dada = new char[len+1];
	strcpy(this->m_dada, string.m_dada);
}

//实现operator=
MyString& MyString::operator=(const MyString &string){
	if(this == &string){ //一定要判断是否相等
	    return *this;
	}
	int len = strlen(string.m_dada);
	delete[] this->m_dada; //释放之前空间的内容
	this->m_dada = new char[len+1];
	strcpy(this->m_dada, string.m_dada);
	return *this; //类的成员函数返回类的引用对象是直接返回*this
}

//实现析构函数
MyString::~MyString(void){ //无参数列表加个void
	delete[] this->m_dada;
	this->m_dada = NULL; //防止空指针
}

注意几个问题:

1. 赋值运算符函数的返回值应该是该类型的引用,所以在函数结束之后要返回*this。

    一般对于类的成员函数返回值是类的引用的话函数结束直接返回*this

2. 拷贝构造函数的参数必须只能为类型的引用,并且只能是一个参数。如果拷贝构造函数参数不是引用那么将会引起无限递归,调用构造函数内部继续调用构造函数。

3. 赋值运算符函数中参数是不是声明为const类型的引用。如果不声明为引用那么每次在调用函数的时候都会执行一次拷贝构造函数,降低了效率。如果声明为引用类型则可以避免这些无用的消耗,提高代码效率。

    注意在赋值运算符函数中,注意一定要判断是否赋值的两个对象是同一个。如果没有判断,则假如两个对象是一样的话delete掉之后会导致对象内存释放,再也无法找到对象的值了。

4. 要及时的释放内存空间,释放完空间之后要把指针指向NULL

5. 参数如果是只读的话,要加上const,防止被意外修改

时间: 2024-09-16 16:54:06

【15】实现一个MyString类的相关文章

使用libzplay库封装一个音频类

装载请说明原地址,谢谢~~      前两天我已经封装好一个duilib中使用的webkit内核的浏览器控件和一个基于vlc的用于播放视频的视频控件,这两个控件可以分别用在放酷狗播放器的乐库功能和MV功能上,也可以用于其他duilib项目,说起来做仿酷狗程序,但是至今我虽然把仿酷狗的主界面做好了,但是还没有播放音乐的功能,所以今天就再封装一个音频类.    我以前并不怎么使用音频和视频的功能,所以对常用的视频库和视频库不太了解,而我肯定不会使用系统的win32控件或者MFC里面的类,因为多数系统

明明只建立了一个线程类,为何进行时这么卡,而且没有转头效果

问题描述 明明只建立了一个线程类,为何进行时这么卡,而且没有转头效果 这是GameUtil里的 public static void addFishes(ArrayList<Fish> Fishes){ int count=rand.nextInt(6)+5; for(int i=0;i<count;i++){ Fish f=new Fish(); f.setState(State_Swin); f.setLevel(rand.nextInt(11)+1); f.setDrawCount

详解C++中实现继承string类的MyString类的步骤_C 语言

昨天师兄又出了道测试题,让我们实现类似于string类的没有MyString类,刚开始很头疼,可是真正在自己写代码的时候又很兴奋的发现,这个过程真的是个很宝贵的机会,让我又有机会可以很好的熟悉回顾C++的很多知识-类设计,构造析构函数,成员函数,友元函数,引用,重载,字符串操作,动态内存分布.....于是昨天花了半天时间写了300多行代码,并认真的进行了相关测试.修改和总结.因为内容有点丰富,所以想分几次写出来,条理也清楚些. 类的空间分配:类给它的每个对象都分配了独立的空间去存储它的数据成员,

一个Ajax类

ajax 一个Ajax类function Ajax(url,recvT,stringS,resultF) {    this.url = url;    this.stringS = stringS;    this.xmlHttp = this.createXMLHttpRequest();    if (this.xmlHttp == null) {        alert("erro");        return;    }    var objxml = this.xml

jsp或者说JAVA倒底有多快?这里有一个计时类,可以帮你的忙。同时支持JAVA和JSP。内有例子。

js //作者:sonymusic//原载于豆腐技术站(www.asp888.net)package sony.utils; import java.util.*;import javax.servlet.jsp.*;/*** 一个计时类.* 创建日期:(2000-11-6 13:09:38)* 作者:SonyMusic(sonymusic@china.com)*/public class Timing{private ArrayList nameArray=new ArrayList();pr

如何编写一个ASP类

前几天大佛写了"ASP设计模式",可能有些初学者或者刚刚接触ASP的朋友不一定完全看得明白,偶就整理了一下编写一个ASP类的方法,大部分是从网上找来的.希望对朋友们有帮助. <ASP设计模式>(作者 我佛山人): 首先ASP的类是由事件和方法(它们就是构成类的成员了)构成的,如果大家还没有接触过,可以先看看下面的说明:在 Class 块中,成员通过相应的声明语句被声明为 Private(私有成员,只能在类内部调用) 或 Public(公有成员,可以在类内外部调用) .被声明

Flash制作的一个3D类效果

刚从Macromedia官方网站上淘到一个3D类,不知道以前发过没有.觉得还不错,就发上来了.有兴趣的朋友可以下载看看. 点击这里下载源文件 自己写了一篇教程,对自学有一些帮助 Macromedia 3Dclasses1.添加场景SceneName:Scene= new Scene();属性:clip:MovieClip 绘制物体的影片剪辑f:Number 焦距比数,过小会使物体变形,默认为300(最自然)quaternion:Quaternion 四元数,默认为0,0,0,1(处理旋转用)方法

在定义一个js类的时候,为什么要设置该类的prototype属性为它所要继承的类的

在定义一个js类的时候,为什么要设置该类的prototype属性为它所要继承的类的实例对象 在写JavaScript类定义的时候,大家很可能都写过下面的代码: function A() {} function B() {} B.prototype = new A() 上面这样写是为了让instanceof语句能起作用.举个例子: 1.不重写子类的prototype属性 b = new B(); b instanceof B //return true b instanceof A // retu

hibernate可不可以根据一个实体类查询出数据库中是否存在该记录

问题描述 hibernate可不可以根据一个实体类查询出数据库中是否存在该记录 需要判断一条记录是否已经在数据库中是否存在重复记录,用hql的话传入的参数会比较多