关闭

C++ builder :关键入门 AnsiString

标签: c++pascaldeletestringobjectc
852人阅读 评论(0) 收藏 举报
分类:
  其实是一个类(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应该比较容易懂
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:14700次
    • 积分:323
    • 等级:
    • 排名:千里之外
    • 原创:17篇
    • 转载:3篇
    • 译文:0篇
    • 评论:7条
    文章分类
    最新评论
  • 无耻

    genghouwang: 我将摆脱不了时间的惩罚,历史的惩罚。为不后悔,我真该有所改变了

  • 无耻

    genghouwang: 就我这样的精神状态,不仅学习失败,工作失败,其他各个方面也会失败。我有很变态的心理能量,把自己训练成...

  • 无耻

    genghouwang: 说话不算话,我的心不好。没有决心,不会狠心,我永远停留,表面的和根基相差太大,怎么能让优秀成为习惯?

  • 群发博客小设计

    genghouwang: 而相比之下,苹果iPhone销量虽然只占全球手机市场的9%,但其利润却占整个行业的75%,而随着三星...

  • 群发博客小设计

    genghouwang: 从去年底到今年初,国产品牌密集发布新机发展计划,性价比颇高的千元智能手机大规模上市,体现出国产品牌高...

  • 你的未来你想过?Linux和windows之见!

    genghouwang: ftp 客户程序:lftp,ncftp。它们都是文本方式操作的,但是比起图形界面的方便的多。比如 ...

  • 评论:【观点】开源者的信仰正在崩塌

    genghouwang: 开源只是意味着自由,选择不公开业也是一种自由,这是保护隐私和知识产权。而商业化与开源也未必有必然矛盾