zoukankan      html  css  js  c++  java
  • C 风格字符串,C++string类,MFC,CString类的区别。

    字符串,顾名思义是由字符组成的字符串,在标准C,标准C++,MFC中 字符串这一功能的实现是不相同的,C++完全兼容了C。

    1.  标准C中的字符串   

    在标准C中没有string这样的数据类型,C中的字符串是有char类型的字符数组或者char类型的字符指针来实现的。例如:

         char   name[26]="This is a C-style string"; 或者

         char  *name="This is a C-style string"; 

       类型的字符串以\0为结束标记,所占内存是实际子符长度+1,其初始化和赋值都要逐个字符的赋值,修改不辨,粒度太小,很不直观,是程序员分散了一些软件的高级层面问题,如算法,抽象数据类型或软件构架。char   *没有构造函数,仅能由指针赋值,而且是一个极其危险的操作,在声明char * 的时候如果没有赋初值,建议先初始化为NULL,以免出现悬浮指针或者指向地址不明的指针,否则,出错会让你很爽!

       标准C中是没有string类型,但是在C中有string.h头文件,需要注意的是此string.h中的string 非彼string,<string.h>头文件中定义了一些我们经常用到的操作字符串的函数,如复制函数strcpy,连接字符串strcat,比较字符串strcmp,这些函数的操作对象都是指向char *的字符串。

    2.标准C++中的string类

        C++支持C风格字符串的使用,而且引入了string类的概念,string为标准模板类STL定义的字符串,几乎可以从所有的字符串构造出来。

    string字符串类的都文件是<string>,并且要和using namespace std;  一起使用。头文件<string>和头文件<string.h>没有任何关系,前者是标准C++中的模板库类,后者是标准C中的包含常用C字符串处理函数的头文件,如strcmp,前者并非是后者的升级版。

       要深刻理解标准C++中string是一个类, 如在标准C中定义如下:char * pt=NULL;      这无疑是正确的,但是在标准C++中定义  string  *pt=NULL;这样做编译器不会有警告和错误,但是运行是就会有异常。这是因为string作为一个类,定义类的对象时要调用其构造函数的,上面的例子既没有调用其构造函数,还把指针赋值为NULL,很明显就会出错的。正确的 方法是是new操作符,C++中的new不同于C中的malloc, new不但会分配一块内存,还调用类的构造函数。string *pt=new("this is a c++-style string"); 或者不用指针 string  str;系统自动调用默认的构造函数,构造一个string类的对象。

    3. MFC中的CString类。

            MFC中的字符串类是CString,封装了string的东西,并增加了一些接口,在功能上完全兼容string类,而一些标准的C/C++不能直接对CString类进行操作,CString 类是微软的visual c++提供的MFC里面的一个类,所以只有支持MFC的工程才可以使用。如在linux上的工程就不能用CString了,只能用标准C++中的 string类了。另外,因为string类是在c++标准库中,所以它被封装在了std命名空间中,使用之前需要声明using namespace std;而CString类并不在std命名空间中,因为它不是c++的标准库,只是微软的一个封装库。这点看来用string类的程序的移植性更好。CString和string提供的接口方法不同,对char*的转换也不同。下面的转换内容来自CSDNBLOG:http://blog.csdn.net/bitxinhai/article/details/2292014

    4.1 CString 和string的转换

      stringstr="ksarea";
    CStringcstr(str.c_str());//或者CString cstr(str.data());初始化时才行
    cstr=str.c_str();或者cstr=str.data();
    str=cstr.GetBuffer(0); //CString -> string
    cstr.format("%s", str.c_str()); //string->CString
    cstr.format("%s", str.data()); //string->CString
    str = LPCSTR(cstr); //CString->string
    /*c_str()和data()区别是:前者返回带'/0'的字符串,后者则返回不带'/0'的字符串*/

    4.2.CString和int的转换inti=123;
    CStringstr;
    str.format("%d",i);//int->CString 其他的基本类型转化类似
    i=atoi(str);//CString->int 还有(atof,atol)4.3.char*和CString的转换CStringcstr="ksarea";
    char* ptemp=cstr.getbuffer(0);
    char* str;
    strcpy(str,ptemp);//CString->char*
    cstr.releasebuffer(-1);
    char*str="lovesha";
    CStringcstr=str;//char*->CString string类型不能直接赋值给CString至于int与float、string与char*之间的转化可以使用强制转化,或者标准库函数进行。对于CString与其他类型的转化方法很多,但其实都殊途同归,朝着一个方向即将类型首先转化为char*类型,因为char*是不同类型之间的桥梁。得到char*类型,转化为其他类型就非常容易了。这篇文章: http://hi.baidu.com/sage_haokun/blog/item/a44b9733aa14d812ebc4afbc.html ,还不错,主要讲述CString和string的区别,感兴趣的可以去瞅一下。

  • 相关阅读:
    JS BOM对象 History对象 Location对象
    JS 字符串对象 数组对象 函数对象 函数作用域
    JS 引入方式 基本数据类型 运算符 控制语句 循环 异常
    Pycharm Html CSS JS 快捷方式创建元素
    CSS 内外边距 float positio属性
    CSS 颜色 字体 背景 文本 边框 列表 display属性
    【Android】RxJava的使用(三)转换——map、flatMap
    【Android】RxJava的使用(二)Action
    【Android】RxJava的使用(一)基本用法
    【Android】Retrofit 2.0 的使用
  • 原文地址:https://www.cnblogs.com/lidabo/p/2658528.html
Copyright © 2011-2022 走看看