ghw的专栏

耿然,沂蒙山区人,青岛大学

C++ builder :关键入门 AnsiString

  其实是一个类(class),不过,它并不归属于VCL的框架,不是派生于TObject. 该类封装了C,C++里字符串的大多操作,并有所发展。方便了C++程序员在程序中使用字符串。下面挑典型和重要的说。  
   
  第一: 现在你不用(显式地)为字符串管理内存了:  
  AnsiString name = "Mike";  
  ShowMessage(name); //显示Mike  
  name = "张三";  
  ShowMessage(name); //显示张三  
  AnsiString name2 = name;  
  name = 李四";  
  ShowMessage(name);  
  ShowMessage(name2);  
  AnsiString twoName = name + name2;  
  ShowMessage(twoName);  
   
  上面其实说明了,AnsiString 重载了 = 和 + 操作符,让我们可以直接通过简单的=或+操作,来赋值,改变一个字符串。  
  如果不用Ansistring这样或类似的而在C,C++,同样的操作将是类似于(并不一定和上面完全一致的过程):  
  char* name = "Make";  
  ShowMessage(name);  
  name = new char[strlen("张三") + 1];  
  stcpy(name, "张三");  
  ShowMessage(name);  
  char* name2 = new char [strlen(name1)+1);  
  strcpy(name2,name);  
  delete[] name;  
  name = new char[strlem("李四")+1];  
  strcpy(name,"李四");  
  ShowMessage(name);  
  ShowMessage(name2);  
  char* twoName = new char [strlen(name) + strlen(name2) + 1)];  
  strcpy(twoName,name);  
  strcat(twoName,name2);  
  ShowMessage(twoName);  
  delete[] twoName;  
  delete[] name2;  
  delete[] name;  
   
  肯定可以看出后者在内存管理(初始分配,扩容,连接,释放)上的一堆琐事。当然,可以考虑用纯C的 malloc,realloc, free ,及 sprintf连减少一些操作,但在C++世界里,这样的内存管理会和使用new,new[] , delete,delete[]的代码在交接上产生问题。并不是C++程序员的首选。  
   
  可能还会说,我就是原意累点,可是直接写内存管理,会带来高效率啊。。这是不知量力。由于字符串管理在一个程序中的使用率太高了,事实上不管是VC的 CString, 还是STL的string,或者是C#的string,及我们这里的AnsiString,统统采用内存池,及“realloc on modify(在修改时才生分配内存)”等技术,可谓既提高了连续内存使用率,又提高了运行速度,这类高级功能,不是一般你我有精力甚至能力去实现。  
   
  第二,小心,AnsiString 带有Pascal风格。  
  AnsiString这个类也重载 [] 操作符 ,用于得到字串中指定的字符,可是,虽然AnsiString纯是用C++写成,但它是为了实现Object Pascal内置类型string,所以必须和Object Pascal保持兼容,所以,它的下标也是从1开始:  
  AnsiString pascal = "Pascal";  
  char c = pascal[1]; // c 是 'P' :(  
   
  第三,可以得到C风格的字符串。  
  Windows在编程接口上还是非面向对象,(等.Net完全取代后,就是了) 它的API还得用到很多的C风格的字符串(上面我们举例的那个);再者,C++既然说完全兼容C,那我们难免有时还会喜欢用用C的函数库。  
  AnsiString s = "123456";  
  int len = strlen(s.c_str());  
  没错, c_str() 这个成员函数返回的是一个 const char* 常量字符串指针。 因为是const的,所以用在类似strlen()这样仅要求是const char* 的函数还算方便,如果你想安全一点,或者人家函数指定就不能是const ,那你只好复制走:  
  AnsiString s = "123456";  
  char* tmp = new char[7];  
  strcpy(tmp, s.c_str()); //复制  
  然后对tmp爱干嘛干嘛去。  
   
  第四,它有好多字符串操作成员函数,并一般都有对应的同名全局函数。  
  比如取长度:  
  AnsiString s = "Hello!";  
  int len = s.Length(); //求长度  
  但你也可以这样:  
  int len = Length(s);  
  或例如求子串:  
  string subString = s.SubString(2,3);  
  ShowMessage(subString) // "ell"  
  同样用个全局的SubString(s,2,3);  
  注意了,索引从1开始。  
   
  第五,如果要用空串,最好不用 "";  
  而是:  
  AnsiString emptyStr = *NullStr;  
   
  第六,作为对 printf ,sprintf,格式函数的代替,请有Format函数。  
  AnsiString fmtStr = Format("我叫%s,今天是%d年%02d月%02日,我长%d岁了",  
  ARRAYOFCONST (( "南郁",2004,4,21,1)) );  
  ARRAYOFCONST这个宏,及Foramt格式串指令请看帮助。记得ARRAYOFCONST一定要带双层括号,如果你不喜欢用这个鬼宏,你可以另想办法。  
   
  第七,String就是AnsiString.  
  typedef AnsiString String;  
   
  第八,在VCL,几乎所有字串都是AnsiString。若是属性,则有要求, += 的重载对属性不保证一定起作用。  
   
  Form1->Caption = "窗口标题"; //OK  
  Form1->Caption += " - 世界你好"; //Err  
  Form1->Caption = Form1->Caption + " - 世界你好"; //OK  
   
  同样的事情发生 >>(移出) 或 << (移入) 重载上。如字符:  
  this->Font->Style >> fsBold; //不行的

网上转的,其实ansiString看看help应该比较容易懂
阅读更多
个人分类: C++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭