C++ builder :关键入门 AnsiString

转载 2012年03月23日 14:40:43
  其实是一个类(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++ Builder AnsiString 类

AnsiString类 C++ Builder AnsiString 类介绍和使用 介绍AnsiString类之前,先要介绍一些背景知识。VCL大量利用Pascal长字串数据类型,几乎所有...

AnsiString和String的区别、使用

C/C++语言在CB中的一些特定用法   2)AnsiString是从Delphi中引进来的吗?   答:CB的核心组件VCL是用Object Pascal语言写出的,所以CB的VCL组件...

AnsiString的基本用法 bcb第一弹

最近由于处在半转型状态,学bcb也是模模糊糊。 由于在学C++builder,ansistring是bcb中提供的类跟java中的String差不多  但是,比c++ 中的String在bcb中...

C++入门和关键特性总结

在这几年使用c++的开发过程中,本人感觉 1、C++的设计很复杂,很多特性非常微妙而且难以掌握,对于应用开发程序员,一般情况下只用到基本的特性,在语言的非本质细节上投入太多精力得不偿失,并且也很难记...

C++入门学习——explicit关键字的作用

C++语言定义了内置类型之间的几个自动转换。也可以定义如何将其他类型的对象隐式转换为我们的类类型, 或将我们的类类型的对象隐式转换为其他类型。 C++提供了关键字explicit,可以阻止不应该允许的...

《C++ Builder 5.0经典入门》

  • 2013-04-05 10:34
  • 1.28MB
  • 下载

C++_Builder 入门

  • 2012-03-27 22:00
  • 1.44MB
  • 下载

17.[个人]C++线程入门到进阶(17)----关键段,事件,互斥量,信号量的“遗留”问题

在《秒杀多线程第九篇 经典线程同步总结 关键段 事件 互斥量 信号量》中对经典多线程同步互斥问题进行了回顾和总结,这篇文章对Windows系统下常用的线程同步互斥机制——关键段、事件、互斥量、信号...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)