码迷,mamicode.com
首页 > 其他好文 > 详细

关于CString 类的初步实现

时间:2015-05-16 23:08:41      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

耗费了2个小时重写了一遍CString 若有漏洞 欢迎指出~ 谢谢

首先贴出代码部分:

 

////////////////////////////////////////////////////////////////

////////////////////////XNString.h////////////////////////////

////////////////////////////////////////////////////////////////

#pragma once
typedef int BOOL;
class CXNStringA
{
public:
    CXNStringA(void);
    bool Create(char*);
    bool CutLeft(int);
    bool CutRight(int);
    //not include the null at the last pace of the string
    int GetLength();
    int GetBytes();
    void Release();
    char* GetCStr();
    void AddAtEnd(char*);
    CXNStringA operator=(char* str );
    CXNStringA operator+=(char* str);
    CXNStringA operator=(CXNStringA& str);
    CXNStringA operator+=(CXNStringA& str);
    operator char* ();
    ~CXNStringA(void);
   
private:
    //c mode string
    char* m_str;
    char* m_strDup;
    //include the null at the last pace of the string
    int   m_strlen;

};

 

////////////////////////////////////////////////////////////////

////////////////////////XNString.cpp////////////////////////////

////////////////////////////////////////////////////////////////


 

#include "StdAfx.h"
#include "XNString.h"

 

 

CXNStringA::CXNStringA(void)
{
    m_str = 0;
    m_strlen = 0;
    m_strDup = 0;
}


CXNStringA::~CXNStringA(void)
{
    this->Release();
}

bool CXNStringA::Create(char* str)
{
/*
    printf("Length of ‘%s‘ : %d\n", mbstr1, _mbstrlen(mbstr1) );
    printf("Bytes in ‘%s‘ : %d\n", mbstr1, strlen(mbstr1) );  
*/
    if(0!=m_str)
        delete[] m_str;
    //strlen 返回的是字节数(不包括末尾NULL) _mbstrlen();
    m_strlen = strlen(str) + 1;
    m_str = new char[m_strlen];
    return strcpy_s(m_str,m_strlen,str)?FALSE:TRUE;
   

}

void CXNStringA::Release()
{

    if(m_str)
        delete[] m_str;
    m_str = 0;
    m_strlen = 0;
    if(m_strDup)
        free(m_strDup);
    m_strDup = 0;

}

int CXNStringA::GetLength()
{
    return m_strlen-1;
}

bool CXNStringA::CutLeft(int numCut)
{
    if(0==m_str)
        return false;
    int newLen= numCut+1;
    char* oldStr=m_str;
    m_str = new char[newLen];
    m_strlen=newLen;
    strcpy_s(m_str,newLen,oldStr);
    m_str[numCut] = 0;
    delete[] oldStr;
    return true;
}

bool CXNStringA::CutRight(int numCut)
{
    if(0==m_str)
        return false;
    int newLen= numCut+1;
    char* oldStr=m_str+sizeof(char)*(m_strlen-numCut-1);
    m_str = new char[newLen];
    m_strlen=newLen;

    strcpy_s(m_str,newLen,oldStr);

    return true;
}

CXNStringA CXNStringA::operator=( char* str )
{
    //here here
    CXNStringA string;
    string.Release();
    string.Create(str);
    return string;
}

CXNStringA CXNStringA::operator=( CXNStringA& str )
{
    return str;
}

char* CXNStringA::GetCStr()
{
    if(!m_str)
        return 0;
    if(m_strDup)
        free(m_strDup);
    m_strDup = _strdup(m_str);
    return m_strDup;
}

int CXNStringA::GetBytes()
{
    return m_strlen;
}


CXNStringA::operator char *()
{
    if(!m_str)
        return 0;
    if(m_strDup)
        free(m_strDup);
    m_strDup = _strdup(m_str);
    return m_strDup;
}

CXNStringA CXNStringA::operator+=( char* str )
{
    if(str)
        this->AddAtEnd(str);
    return *this;
}

CXNStringA CXNStringA::operator+=( CXNStringA& str )
{
    if(str.m_str)
        this->AddAtEnd(str.m_str);
    return *this;
}

void CXNStringA::AddAtEnd( char* str)
{
    if(NULL==m_str)
        return;
    int len=strlen(str);
    char* old = _strdup(m_str);
    delete[] m_str;
    m_strlen+=len;
    m_str = new char[m_strlen];
    strcpy_s(m_str,m_strlen,old);
    strcat_s(m_str,m_strlen,str);
    free(old);
}

////////////////////////////////////////////////////////////////

////////////////////////stdafx.h////////////////////////////

////////////////////////////////////////////////////////////////

#pragma once

#include "targetver.h"
#include <string.h>
#include <stdlib.h>
#define WIN32_LEAN_AND_MEAN        


#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
////////////////////////////////总结////////////////////////////////

1.strlen()获得的是str的字节数(不包括末尾的NULL字节)

2._strcat()可以将一字符串连接到另一字符串末尾,但要注意需要重新分配内存。

3._strcup()创建一份字符串的拷贝,但是要注意事后free()解决问题

4.重载类型转换运算符的问题:

operator XXX ();

5.new 和 malloc()的区别在于:

1.malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存

2.对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。

3.因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。
4.C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。
5.new可以认为是malloc加构造函数的执行。new出来的指针是直接带类型信息的。而malloc返回的都是void*指针。

new delete在实现上其实调用了malloc,free函数

6.new建立的对象你可以把它当成一个普通的对象,用成员函数访问,不要直接访问它的地址空间;malloc分配的是一块内存区域,就用指针访问好了,而且还可以在里面移动指针.

7.new 建立的是一个对象;alloc分配的是一块内存.

6.delete 和 free()的区别在于:

1. delete 用于释放 new 分配的空间,free 有用释放 malloc 分配的空间

2. delete [] 用于释放 new [] 分配的空间

3. delete 释放空间的时候会调用 相应对象的析构函数

     顺便说一下new在分配空间的时候同时会调用对象的构造函数,对对象进行初始化,使用malloc则只是分配内存

4. 调用free 之前需要检查 需要释放的指针是否为空,使用delete 释放内存则不需要检查指针是否为NULL

5. free 和 delete 不能混用,也就是说new 分配的内存空间最好不要使用使用free 来释放,malloc 分配的空间也不要使用 delete来释放

关于CString 类的初步实现

标签:

原文地址:http://www.cnblogs.com/xnzzj/p/4508743.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!