首页
登录 | 注册

string也可以很精彩

string也可以很精彩

http://blog.csdn.net/norains/article/details/3215934

//========================================================================
//TITLE:
//    string也可以很精彩
//AUTHOR:
//    norains
//DATE:
//    Moday 03-November-2008
//Environment:
//    NONE
//========================================================================
    对于习惯于MFC架构的朋友来说,估计直接采用API方式写代码最痛苦的莫过于没有CString。其实,在STL里面,我们依然还有std::string可用,虽然在某些程度中不及CString便利,但也能勉强聊胜于无了。
   
   
    1.宏定义
   
     在WinCE编程中,我们几乎很少直接使用wchar_t,对于char也是如此。取而代之,我们更倾向于微软的建议:TCHAR----没办法,谁让wince是微软的产品呢?但既然都已经上了这贼船,那么我们不妨也入乡随俗一把,将std::string也做类似的定义吧:
    
     #ifdef UNICODE
      #ifndef TSTRING
       #define TSTRING std::wstring
      #endif
     #else
      #ifndef TSTRING
       #define TSTRING std::string
      #endif
     #endif
    
     带来的另外一个好处是,我们可以少敲打四次键盘。从延长键盘寿命的角度考虑,这也算是一大贡献。好吧,为了我的键盘能够服役得更久一些,接下来的内容,我都会直接采用TSTRING替代。
    
    
    2.初始化
   
    初始化的方式多种多样,一般会有如下:
    TSTRING strA = TEXT("A");
  TSTRING strB(TEXT("B"));
  
  如果和容器打交道,那其实也很简单:
    std::vector vtC(MAX_PATH,0);
  TSTRING strC(vtC.begin(),vtC.end());
  
  
  3.赋值
  
  初始化简单,赋值也不会差哪里去:
  
  strA = TEXT("A2");

  TCHAR szB[] = TEXT("B2");
  strB = szB;
  
  和容器打交道,同样也是简单:
  strC = &vtC[0];
  
  
  4.追加
  
  让我们回忆一下纯粹用数组的日子,如果想要在一固定的数组后面追加字符串,那么我们首先要分配一个足够大的空间,然后赋值旧的数值,最后再追加新值。也许很多人对下面这段伪代码记忆犹新:
  
  TCHAR *pBuf;
  ...  
  TCHAR *pNew = new TCHAR[_tcslen(pBuf) + TEXT("Append") + 1];
  _tcscpy(pNew,pBuf);
  _tcscat(pNew,TEXT("Append"));
  delete []pBuf;
  pBuf = pNew;
  
  呃,没错,的确如此,如果我们需要在一个数组末尾追加新值,这些麻烦的事情我们必须要亲身经历的。还好,我们现在终于可以和这种折磨人的玩意说Goodbye了。对于string而言,追加新值?很简单,就像JAVA一样:
  strA += TEXT("Append");
  
  是的,你没看错,就是一条语句,再无别处。
  
  对于数组,对于容器,同样如此:
  strB += szB;
  strC += &vtC[0];
  
  
  5.与API函数打交道
  
  Windows平台的API函数,自然是要照顾C的使用者。所以,可以这么说:大部分的API函数,为了能够在C中调用,基本上采用的都是C接口的写法。而TSTRING,确切地说,是一个class,而不是一个value type,所以无法直接赋值。
  
  以CreateFile为例,其声明如下:
    HANDLE CreateFile(
    LPCTSTR lpFileName,
    DWORD dwDesiredAccess,
    DWORD dwShareMode,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD dwCreationDisposition,
    DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile
    );
 
    第一个参数是LPCTSTR,为一个指针,所以这样直接赋值铁定是通不过编译的:
    CreateFile(strA, ...);
   
    还好,伟大的STL构建者已经为我们考虑到了这个问题,我们只需要调用c_str函数即可:
    CreateFile(strA.c_str(), ...);        
   
    类似,c_str还可以用在_tcslen,_tcscat等纯粹的字符串函数。     


相关文章

  • 先说结论(不一定适用所有环境): 1) GCC默认开启了返回值优化(RVO),除非编译时指定"-fno-elide-constructors": 2) 现代C++编译器一般都支持返回值优化: 3) string的拷贝构造 ...
  • 说明:以下涉及的std::string的源代码摘自4.8.2版本. 结论:std::string的拷贝复制是基于引用计数的浅拷贝,因此它们指向相同的数据地址. // std::string类定义 typedef basic_string s ...
  • 一.String与Date(java.util.Date)互转 1.1 String -> Date Java代码 String dateStr = "2010/05/04 12:34:23";           ...
  • 从维护转到开发报表,Java 如何将String转化为Int忘记了,特此记录一下. 在 JAVA中要将 String 类型转化为 int 类型时,需要使用 Integer 类中的 parseInt() 方法或者 valueOf() 方法进行 ...
  • Java中String的substring函数(转载)
    你了解Java中String的substring函数吗? Java中的substring函数是我们经常使用的一个函数,用来截取当前字符串的子串,定义如下: public final class String{ public String s ...
  • 使用Xamarin.Forms的企业应用程序模式(电子书)--MVVM
    XAMarin.Forms的开发人员经验通常涉及在XAML中创建用户界面,然后添加在用户界面上运行的代码隐藏. 随着应用程序的修改和扩展的规模和范围,可能会出现复杂的维护问题. 这些问题包括UI控件和业务逻辑之间的紧密耦合,这增加了UI修改 ...

2020 unjeep.com webmaster#unjeep.com
12 q. 0.011 s.
京ICP备10005923号