C++ primer plus ———第四章复合类型(一)

前面已经回顾了C++中的基本类型,而复合类型就是利用基本类型来创建的,数组是由多个同类型元素组成的,特别有字符数组用来存储字符串;结构由多个不同类型的元素组成;指针是一种告诉计算机数据在内存位置的变量。

一、数组
1.由多个确定的同类型基本类型元素构成,利用下标获取数组元素,对每个元素做处理
2.声明:类型 数组名[个数]:个数必须在编译时就确定下来,可以是个符号常量、常量表达式、字面值
3.数组的初始化时刻有限制,仅仅在声明时才可初始化,如果在声明时没有初始化,数组元素的值时随机的,而且不能够再进行初始化

未初始化的字符数组有多随机,简直可怕!不要随便使用未初始化的变量
char a[10];
cout << strlen(a) << endl;

在这里插入图片描述
4.数组之间不可以赋值,但可以访问数组元素并进行赋值
5.列表初始化器(用逗号分隔的值列表)为空,则对数组元素赋予默认值;可以不指定数组元素的个数,使用列表器中元素个数来确定声明的数组元素个数;列表器防止发生窄化。

二、字符串
存储在内存的连续字节中的一系列字符,默认由’\0’标识字符串的结束。
字符串常量由双引号表示(由本身的值和’\0’组成),字符串常量表示的其在内存的地址。
对于字符串的处理,依赖于末尾是’\0’。
如何存储字符串?
1.字符数组
两种方式支持字符串存入到字符数组:
1.用字符串初始化字符数组
2.文件、键盘的输入存入到字符数组
在将字符串存入字符数组时,字符数组元素自动加入’\0’;我们无需指定数组长度,编译器利用字符串常量来确定字符数组长度;字符数组的长度至少是字符串可见长度+1;利用strlen()得到的是字符串可见长度
末尾没有’\0’的字符数组不能当做字符串来处理(利用内置的字符串处理函数,比如cstring库中函数)
字符串输入:
直接使用cin获取字符串,如果字符串包含空格,可能无法得到我们想要的字符串,字符串是以空字符划分,因此遇见空格视为字符串结束。为了解决这个问题,istream类提供了get()和getline()成员函数。
getline函数:
形如getline(数组名,数组长度):可能有两种情况:遇到了回车符,或是已经到了指定的长度
以回车标识字符串的结束,同时从输入流中读出并丢弃回车
get函数:
形如getline(数组名,数组长度):可能有两种情况:遇到了回车符,或是已经到了指定的长度
无参get()读取一个字符
以回车标识字符串的结束,对回车符不做任何处理,依旧在输入流中,这就产生了新的问题,本希望读新的字符串,却读出了一个空行。可以用无参的get函数,从输入流中读出这个回车符。


int main()
{
	int number[]{ 1,3,2 };
	int const len = 20;
	char name[len]{};
	char dessert[len]{};
	cout << "your name:";
	cin.getline(name, len);
	//cout << endl;
	cout << "dessert:";
	cin.getline(dessert,len);
	cout << name << " like " << dessert;
	cout << endl;
	char name2[len];
	char food[len];
	cout << "name ";
	cin >> name2;//直接利用cin输入字符数组,空格、回车依旧在流中
	char c;
	cin.get(c);//读取单词间的空格
	cout << c;//输出了一个空格
	cout << "food ";
	cin >> food;//输入流中有字符,不用等待键盘键入,直接从流中去字符串
	cout << name2 << " like " << food;
	
	cin.get(c);
	cout << c;//获取到了换行
	cin.get();//等待一个输入,防止窗口闪退
    return 0;
}

2.string类
使用string类型对象来存储字符串,使用string类需要包含头文件string,且string类在名称空间std中。不妨将string类型视作字符串的实体,字符数组看作是存储字符串的一系列字符单元。
与字符数组相同的使用方法:
1可以用字面值初始化string对象
2可以利用cin通过输入流来初始化string对象,直接利用cin输入到string对象,也是以空字符为结束标识符(与输入到字符数组用法实现一样)
3可以cout string对象
4可以使用索引值来访问string对象中的字符
与字符数组不同之处:
1.字符数组只有在声明的时候才能初始化;但是string变量不局限在声明时才可初始化。
2.数组间不可以赋值,但是string变量间可以赋值
3.支持+、+=操作,操作对象可以是字符串常量和string对象、string对象之间
4.对于c风格的字符串(字符数组表示的字符串),头文件cstring中提供了字符串间的赋值等运算,比如,数组间不可直接进行赋值操作,但函数strcpy()支持字符数组的拷贝,对于string类重载了+拼接运算,但是对于字符数组来说,可以通过strcat函数来实现;strlen函数用来求C风格字符数组的可见长度,对于string对象来说,调用其成员函数size()可获取字符串长度。
5.大小可变,字符数组大小一经确定无法更改,string对象存储字符串时大小具有自适性。比如,字符数组大小在声明时就是确定的,而string对象的大小为0。
6.输入流字符串包含空格,希望以换行符为字符串结束标识符,也是使用getline方法,参数和调用方式变了:getline(cin,string对象名)。字符数组使用cin.getline(字符数组,长度)。

其它形式的字符串字面值
对应于wchar_t、char16_t、char32_t有L,u,U三种字符串字面值。
c++11提出了原始字符串,默认以"(和)“表示字符串的开始和结束,可以用形如R”( ****)"方式来表示。原始的含义()内的字符串是什么样子就输出什么样子,比如想输出双引号,就写双引号,无需转移字符。此外,可以自定义原始字符串开始和结束的标识符,以防止输出的字符串中有标识符,大不了换一个字符串标识符就可以解决这个问题。在“和(之间加任意个数的字符,结束标识符保持一致即可。

string s3{R"("hello C++")"};

三、结构(用户自定义类型)
同一个结构可以存储多个类型的数据
定义结构(有什么样的数据成员,称为结构成员),创建结构变量。
声明结构如下:
struct 类型名
{
成员变量1;
成员变量2;
};
定义结构变量时,可以不用关键词struct,直接使用结构名称。
通常将结构定义在函数域之外,称为外部定义,使得多个函数都可以使用这种类型。
结构变量通过.来访问结构成员(类对象获取数据成员方法是从这里汲取的)。
初始化结构变量,可用列表初始化,数据值用逗号分离
结构变量间支持直接赋值,即对各个结构成员赋值(即便数据成员是数组也能行)
结构数组的初始化,{{对数据成员的初始化,,,},{},{}。。。。}

四、共用体(用户自定义类型)
能表达多种数据类型,但是同一时刻只能表示一种类型。
union 类型名{
数据类型1;
数据类型2;
}变量{…,…};

五、枚举(自定义类型)
enum 类型名{,,,,枚举值};
用来:提供符号常量;定义新的类型
枚举值对应一个整数,默认从0开始赋值
可创建枚举类型的变量
不使用强制类型转换,枚举变量取值只能从枚举值中选定;通过强制转化,可把在枚举量范围内的整数通过类型转化赋给枚举变量。
枚举变量间可以进行赋值
枚举变量可以自动提升为int型,但int型必须通过强制类型转化才可成为枚举类型
可显示定义枚举量的值,他们的值可以相同

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值