C++笔记之复合类型

1.string类
使用string类首先需要包含string头文件,且其位于std名称空间之中,所以在使用string时需用using或std::string两种方式,其使用类似与字符数组,但与数组不同的在于string的长度可以在程序执行时自动的调节
使用方式为string name ;例:string str ; str = "word"也可以在声明的时候直接赋值。可以使用cin >> str来读入string类变量,也可以使用getline(cin,str)来读入(当字符串中含有空格时);且string类变量之间可以进行拼接, 同时string类也可以用于结构体中,如下所示

//   string 拼接
string str1 , str2 ,str3;
str1 = "hello" ;
str2 = "word";
str3 = str1 + str2 ; //str3 = "helloword"
str2 += str1 ; // str2 = "wordhello" 相当于将str1拼接于str2后方

//  string 在结构中的使用
struct car {
			std::string name ;
			int years ;
}

// 使用
car str1 ; // c++中不需要前缀struct 
cin.get();
getline(cin , str1.name)

同时也可以使用c语言库中的的相关函数,在C++中的头文件为cstring(c中的库函数在c++中引用只需要在原头文件名前加c即可),在c中为string.h ,

char charr1[20] = "hello ";
char charr2[20] = " word" ;

strcpy(charr1,charr2) ;  // 将charr2中的内容copy到charr1中 仅限char类型 string类无法使用
strcat(charr1, charr2) ; //将charr2加到charr1尾部 

char car[20] ;
strcat(car , "hello word") ; //若附加的内容大于数组所能接受的最大值则可能会覆盖数组后方不属于数组的存储空间 导致不可预测的后果 这些函数仅可用于char型数组 不能用于string类

strncat(car , "hello woed" , 20) ; //strncat()增加了第3个参数 数组所能接受的最大长度 同时还有strncpy()  

获取string和字符数组的字符长度

int len_str = str.size() ; //用于string类
int len_charr = strlen(charr) ;  // 用于char型数组

2.new与delete的使用
其使用类似于C中的malloc 和 free ,通常需配对使用 否则易发生内存泄漏。new的使用typename *pointer_name = new typename举例如下
所使用的类型可以是各种数据类型包括结构

int *pt = new int ;  //程序向系统申请一个int大小的内存并将其地址给pt指针
. . .
delete pt ; // 释放pt所指向的地址空间 delete用于释放通过new申请的空间 指针可以与使用new申请时的指针不同 如下也成立

int *p1 = new int ;
int *p2 = p1 ;
...
delete p2 ; //此处也成立 因为所指的空间是new所申请的 

也可以使用new来申请动态内存,如下所示:

  int *pa = new int[5] ; // 申请有5个int大小的空间 pa指向数组的第一个元素的地址 数字可以是变量 但在使用new申请时该变量要有确定的值
  *pa = 1 ; //也可以使用pa[0] = 1 ;二者等效 使用new所得到的动态数组可以像使用数组一样使用 与数组不同的是使用new所得到的动态数组无法用
            // sizeof()来得到数组包含的字节数
  ++pa ;   // 移动一个int大小的字节数 例若int是32位(4个字节) 执行此条语句前pa = 0x00 则执行之后pa = 0x04
  *pa = 2 ; 
  --pa ;
  delete [] pa ; //释放pa时要确保指针指向的是new申请的内存的首地址 

delete使用注意:
(1)不能用于去释放非new分配的内存
(2)不能用delete释放同一内存块2次
(3)若数组是用new[ ] 所申请得到的,则释放也要用 delete [] 释放
3.vector 与 array 模板类
(1)vector说明:

  1)使用vector需要包含vector头文件;
  2)vector与array都位于名称空间std中 ;
  3)可以使用不同的数据类型 ; 
  4)可以使用不同的方法来指定元素数(可以是动态的) ; 
  5)vector所使用的存储空间与new相同都位于自由存储区或堆中;
  6)vector创建: vector<typename> vt(N_elem) //n_elem可以是变量但在使用vector时须有确定的值;vt名可任意符合命名规则即可
  例:vector<int> vi(2) // 创建2个int大小的数组 
  vi[0] = 1; //赋值
  vi[1] = 2 ;
  注 : vi[-1] = 5;表示给vi[0]前一个元素赋值 即该元素并不在vi所得到内存空间中,可能会在程序执行时引发未知错误 
       但C++允许这种用法。可以使用at()函数避免此类问题 如vi.at[1] = 2 ;在执行vi.at[-1] = 5 ;
       时因为-1是非法索引 程序会默认中止

(2)array说明:

   1)需包含头文件array ;
   2) array对象长度固定同数组一样;
   3)使用栈(静止内存分配);
   4)array创建:array<typename, n_elem> arr; //arr名可任意符合命名规则即可; n_elem 需是一常量
   例:array<int , 3> a1 = {1, 2, 3 , 4};
   array<int, 3> a2 ;
   a2 = a1 ; //此处是于普通数组的不同之处 即array类可以将一个对象赋给另一个对象 而普通数组则只能逐个元素赋值
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值