c++ 浅谈之三--复合类型

c++ 本身的复合类型包含了类,数组,结构。
数组本身能够单独访问数组元素,数组基本的初始化 int name={1,23,45}或者直接采用int name={}表示把数组所有值赋值为0,部分初始化的情况下也就是只是把前几个值初始化完,后面的值都初始化为0,在使用没有初始化的数组时,取出的值就是以前遗留在数组对应的内存单元中的值;采用sizeof时,sizeof(数组名)=整个数组的字节数,sizeof(数组元素)=数组元素的长度。
字符串,在c++中使用字符串有两钟形式,c风格和c++风格下,在c风格下定义字符串采用char name[SIZE]="";形式对字符串进行初始化,并且字符串尾部都有'\0'结束标志,若进行字符串的连接时,第二个字符串的第一个元素取代第一个字符串的'\0',实现字符串的拼接。
c++风格下实现了string类,可以在包含头文件string.h或者cstring,采用strlen()函数测试数组字符串长度的时候,得到的是当前字符串的长度,而并非数组的长度,而sizeof()得到整个数组的长度,并且strlen()函数只是测试整个字符串不包含非空(即结尾标志\0'')的长度,字符串的实际长度为strlen()+1.
在字符串的输入中,cin遇到空格或者回车符后会结束当前字符串的输入,而把后续的字符串加入到cin输入队列当中,下一次再采用cin输入字符串的时候,则会直接将当前输入队列的值输出。
举例如下:
string a;
cout<<"input a\n";
cin>>a;
cout<<a<<" A"<<"\n";
string b;
cout<<"input b\n";
cin>>b;
cout<<b<<" B"<<"\n";;
执行过程中,依次如下:
input a
hello boy
hello  A
input b
//没有等到输入,直接弹出以下值
boy  B.
以上原因就是输入了hello boy 时候,cin首先接受了hello字符串,遇到了空格后,将boy放入cin队列当中,当提醒输入字符串b的时候,由于cin队列中已经有了boy字符串,因此还没有等到用户输入的时候,boy就默认为cin输入,并紧接着输出boy B。
针对c++字符串,c++提供了面向行的输入函数,getline和get两种。具体应用如下:
cin.getline(str,size);即输入一行到str字符串中,其中输入的最大长度为size-1个。
在此函数中,通过判断回车符来确定输入的结束,当遇到空格时依然将其放入到字符串中,若输入大于size,则只取前面的前size-1个字符作为输入。
cin.get(str,size)函数和cin.getline()函数用法一致,但是不同之处在于cin.getline()函数遇到换行符的时候,将丢弃换行符,处理之前的字符串,而cin.get()函数将当前换行符放入到输入队列当中,因此在cin.get()之后要再进行输入时,要先丢弃当前输入队列中的换行符,否则直接将换行符作为输入,而不会让用户自己输入。
常常采用如下调用:
cin.get(name,size);
cin.get();//当get中没有参数时,系统默认为换行,就把当前队列中的换行符进行处理
cin.get(name2,size2);//输入另外一个字符串


c++ 中string类的应用,初始化string str="init string";也可以直接进行字符串的拼接string a=string_b+string_c,并且c风格的字符串能够兼容到string类中,其字符串相加时,可以为string 对象+char 类型的数组,也能够实现字符串的拼接处理。
也可以采用strcat(str1,str2)函数实现str2和str1的拼接,并放入str1中,还有strcpy(),strcmp()等函数实现字符串的拷贝和比较等。


结构相关
结构也就是我们在c语言中常用的结构体,常常用来实现对象具有多个属性,采用关键字struct函数进行结构体的定义,
struct student
{
  string name;
  int number;
  char sex;
}
然而在c++中可以直接采用结构体名+变量名来定义结构体,而不再使用struct关键字,如student firboy;//定义一个结构体变量firboy
结构体的初始化和数组,常见变量的初始化一样,如下:
student firboy;
firboy={"meiWang",9043051190,'s'};//对其进行初始化。
firboy={};//将整个结构体所占用的内存空间中每个字节都初始化为0


共用体
结构体能够满足一个结构体变量包含多种类型,同时可以调用多种类型的变量,而公用体则同时存储其中的一种类型。给共用体中的变量进行赋值后,上一个赋值将丢失。
union one
{


int a;
foloat n;
}; 每次调用one公用体的时候,只能取int 变量的值,或者n的值,而不能同时得到两个各自的值。因为共用体每次只能存储其中的一种类型,所以共用体的最大存储长度应该为共用体中成员中成员的最大长度。
c++中还有枚举变量,个人感觉不是很常用,看了大概,具体应用大家可以查阅相关资料。


指针
c++中采用指针为基础,其为一个变量,存储的则是值的地址,而非值本身。
指针的定义,typename *point;typename a;
指针的初始花point=&a;//即实现将point指针指向变量a所在的地址,并可以通过*point=’新的变量值‘,来对变量的值进行修改。
也可以使用当前指针指向另外一个指针,其意思就是把当前指向也指向另外一个指针所指向的地址空间。
在c语言中,我们常常采用malloc来实现内存的动态分配,而在c++中,我们一般采用new关键字。
typename *point= new typename;//对point动态分配一个typename大小的内存空间
typename *point=&变量名称;//将其指向当前变量的存储空间
其中new分配的内存块与从常规变量声明分配的内存块不同。new从堆栈或者自由存储区的内存区域分配内存,而常规变量声明则是指向之前变量所存在的内存空间。
使用delete来回收内存空间,当指针变量使用完成后,要对其所占有的内存空间进行释放,以免造成内存浪费。
int *ps=new  int;
//使用完成后
delete ps;
切记delete只是实现当前指针所指向的内存空间的回收,而指针ps本身则不会被删除,仍然可以使用它指向新的存储空间进行使用。
也可以采用new来实现动态数组
int *ps=new int[5];//动态创建一个包含五个元素的数组。
在使用中可以采用数组形式的使用,如ps[0],ps[1]...形式取其值,也可以采用指针形式*ps,*(ps+1)的形式取其变量值,或者采用ps=ps+1方法来依次使ps指向数组中每个元素所在的内存单元,并采用*Ps来取其数组元素值。
采用delete删除动态数组时,形式如delete []ps;
在使用new和delete的过程中应该遵循以下规则:
不要使用delete来释放不是new分配的内存
不要使用delete释放同一内存块两次
如果使用new []为数组分配内存,则应该使用delete[]来释放
如果使用new来为一个实体分配内存,应该使用delete来释放
对空的指针应用delete时安全的。
通用的动态数组创建格式:
typename *point_name=new type_name [num_elements]
delete []point_name;//释放动态数组空间
使用动态数组中,可以采用point_name=point_name+1;让其指向下一个数组元素,其原理是讲当前指针向前移动1个typename类型的字节数,即指向下一个元素。


自动存储、静态存储和动态存储
在函数内部定义的常规变量的使用自动存储空间,称为自动变量,它们在所属的函数被调用时候自动产生,在函数结束时自动消亡。
静态存储是指整个程序执行期间都存在的存储方式,一种是在函数外定义变量,另外一种则是在声明变量时候使用关键字static;
动态存储,new和delete提供了动态存储空间的实现。数据的使用周期不完全受控制或者函数生存时间控制,采用new和delete能够让程序员对程序的内存拥有更大的控制权。


数组的替代品 
vector 和array
此处只是简单的说明下使用方法
#include <vector>
vector <int> vi;//vi是一个vector(int)对象,vector对象在插入或者添加时候自动调整长度,此处将其初始化长度设置为0,但是要调整长度需要使用vector中的各种方法。
int n;
cin>>n;
vector<int> vi2(n);  使用为v2[0] v2[2]...
vector(typename) vt(n_elem) n_elem 可以为整型常量 也可以为整形变量
array<int,5> ai;形式定义 使用则为ai[0] ai[1]等







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值