关于CString 类的初步实现

耗费了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来释放

时间: 2024-11-06 09:41:20

关于CString 类的初步实现的相关文章

CString类的完美总结

①.CString 类对象的初始化: CString str; CString str1(_T("abc")); CString str2 = _T("defg"); TCHAR szBuf[] = _T("kkk"); CString str3(szBuf); CString str4 = szBuf; TCHAR *p = _T("1k2"); //TCHAR * 转换为 CString CString str5(p);

CString转换成int CString类相应函数

CString 型转化成 int 型 把 CString 类型的数据转化成整数类型最简单的方法就是使用标准的字符串到整数转换例程. 虽然通常你怀疑使用_atoi()函数是一个好的选择,它也很少会是一个正确的选择.如果你准备使用 Unicode 字符,你应该用_ttoi(),它在 ANSI 编码系统中被编译成_atoi(),而在 Unicode 编码系统中编译成_wtoi().你也可以考虑使用_tcstoul()或者_tcstol(),它们都能把字符串转化成任意进制的长整数(如二进制.八进制.十进

非MFC的DLL中使用CString类

1.头文件添加 /* 非MFC DLL中使用CString */ #define _AFXDLL #include <afx.h> 注意:要定义在 #include<windows.h>之前,否则会报错 2.cpp 文件中添加 /* 非MFC DLL中使用CString */ // The following symbol used to force inclusion of this module for _USRDLL #ifdef _X86_ extern "C&q

Cstring类

GetLength: 获取CString类的对象包含的字符串的长度(字节数) IsEmpty: 测试CString类的对象包含的字符串是否为空 Empty: 使CString类的对象包含的字符串为空字符串 GetAt: 获得字符串指定位置处的字符 "[]"操作符: 获得字符串指定位置处的字符,作用和GetAt()一样 SetAt: 设定字符串指定位置处的字符 LPCTSTR操作符: 返回指向存储在CString类的对象内的字符的指针 "="操作符: 将一个新的值赋予

CString类中Left(),Mid(),Right()

CString类常用方法--Left(),Mid(),Right() CString::Left(int nCount)const; //从左边1开始获取前 nCount个字符 CString::Mid(int nfirst)const; //从左边第 nfirst+1个字符开始,获取后面所有的字符 CString::Mid(intnFirst,intnCount)const; //从左边第 nFirst+1 个字符开始,获取后面nCount个字符 CStringRight(intnCount)

MFC CString类的函数实现原理

在MFC框架中,CString类用的很多,它是对原来标准c中字符串类型的一种包装,因为里面有两个成员变量char* m_pData和int m_nLength来维护这个类. 对于成员函数: 1.几个默认的构造函数 CString(); //缺省构造 CString( const CString& stringSrc ); //拷贝构造 CString( const char* lpsz ); //根据字符串常量初始化 CString( char ch, int nRepeat = 1); //串

VS2010-MFC(MFC常用类:CString类)

转自:http://www.jizhuomi.com/software/228.html CString类简介 CString类作为MFC的常用类,当之无愧.可以这样说,只要是从事MFC开发,基本都会遇到使用CString类的场合.因为字符串的使用比较普遍,而CString类又提供了对字符串的便捷操作,所以它给MFC开发人员带来了高的开发效率,受到了开发者的欢迎. 大家使用VS2010的话,可能会见到CStringT,实际上它是一个操作可变长度字符串的模板类.CStringT模板类有三个实例:C

CString类常用方法----Left(),Mid(),Right() .

CString Left( int nCount ) const;                   //从左边1开始获取前 nCount 个字符 CString Mid( int nFirst ) const;                      //从左边第 nCount+1 个字符开始,获取后面所有的字符 CString Mid( int nFirst, int nCount ) const;    //从左边第 nFirst+1 个字符开始,获取后面  nCount 个字符 CS

CString类常用方法(转载)

CString Left( int nCount ) const;                   //从左边1开始获取前 nCount 个字符 CString Mid( int nFirst ) const;                      //从左边第 nCount+1 个字符开始,获取后面所有的字符 CString Mid( int nFirst, int nCount ) const;    //从左边第 nFirst+1 个字符开始,获取后面  nCount 个字符 CS