C++复合数据类型

数组

long totals[500] = {0};

该语句的意思是,显式的把第一个元素初始化为0,编译器自动把其他元素都初始化为0。

long totals[500] = {1};

该语句的意思是,第一个元素初始化为1,其他元素都初始化为0。

  • 注意:对数组取地址时,数组名也不会被解释为其地址。数组名被解释为其第一个元素的地址,而对数组名应用地址运算符时,得到的是整个数组的地址。
	short tell[10];
	cout << tell << endl;
	cout << &tell << endl;
  • 从数字上说,这两个地址相同;但从概念上说,&tell[0](即tell)是一个2字节内存块的地址,而 &tell 是一个20字节内存块的地址。因此,tell+1 是将地址值加 2,而 &tell+1 是将地址加20。

字符串

"S"不是字符常量,他表示的是两个字符(字符 S 和 \0)组成的字符串。
'S'是字符常量,注意,字符串常量(双引号)不能与字符常量(单引号)互换!

cin >>

cin使用空白(空格、制表符和换行符)来确定字符串的结束位置,这意味着cin在获取字符数组输入时只读取一个单词。读取该单词后,cin将该字符串放到数组中,并自动在结尾添加空字符(\0)

  • istream 中的类提供了面向行的类成员函数
    1. 面向行的输入: getline()
      该函数读取整行,它通过回车键输入的换行符来确定输入结尾。
      使用cin.getline(数组名,要读取的字符数num)调用,最多读取 num-1 个字符,自动在结尾处添加空字符。
    2. 面向行的输入:get()
      使用cin.get(数组名,要读取的字符数num)读取字符串,或者使用cin.get()读取一个字符。
      get并不再读取并丢弃换行符,而是将其留在输入队列中。
    3. get() 与 getline() 区别
      get() 可以知道停止读取的原因,通过查看下一个输入字符,如果是换行符,说明已读取了整行,否则,说明该行中还有其他输入。
    4. 空行
      当 get() 读取空行时,将设置失效位(failbit),这意味着接下来的输入将被阻断,但可以用下面的命令来恢复输入:cin.clear()
      当 getline() 读取空行时,下一条输入语句将在前一条 getline() 结束读取的位置开始读取。
    5. 输入的字符串比分配的空间长
      get() 和 getline() 将把余下的字符留在输入队列中,getline() 还会设置失效位,并关闭后面的输入。

string 类

  • string 类 位于命名空间 std 中,因此必须提供一条 using 编译指令。
  • 当然还需要 #include <string>
  • 可以使用 ‘+’ 将两个 string 对象合并

结构体

  • 成员赋值
    • 可以用=将结构赋给另一个同类型的结构,这样结构中每个成员都将被设置为另一个结构中相应成员的值,即使成员是数组。

共用体

共用共用,从字面上理解就是共同占用一段内存单元。
所以,共用体能存储不同的数据类型,但只能同时存储其中的一种类型。因此,共用体的长度为其最大成员的长度。

枚举

C++的enum提供了另一种创建符号常量的方式,其句法与使用结构类似。

enum spectrum {red,orange,yellow,green,blue,violet,indigo,ultraviolet=7};
  1. 概念
  • spectrum 是一种新类型→枚举类型
  • red、orange、yellow 等是符号常量,被称作枚举量,对应整数值 0~7。默认情况下,第一个枚举量的值为0,第二个为1,以此类推,也可以显式地指定整数值来覆盖默认值。
  • 注意:后面没有被初始化的枚举量的值将比其前面的枚举量的值大1。
  • 枚举量是整型,可被提升为 int 类型,但 int 类型不能自动转换为枚举类型。
  • 枚举的取值范围:
    • 上限:
      找到大于枚举量的最大值的、最小的2的幂,将它减去1,得到的便是取值范围的上限。如,x 的最大枚举值是101,在2的幂中,比这个数大的最小值为128,因此取值范围的上限是127。
    • 下限:
      找到枚举量的最小值。如果它≥0,则下限为0;否则,采取与找上限相同的方式,但加上负号。如,最小枚举量为-6,比他小的、最大2的幂是-8,所以下限为-7。
  • 存储空间:
    由编译器决定。对于取值范围较小的枚举,使用一个字节或更少的空间;对于包含 long 类型的枚举,使用4个字节。
  1. 作用域内枚举
  • 几个枚举定义中的枚举量可能发生冲突(当名称相同时)。这时可以用作用域解析运算符(::)解决,定义时可以这样
enum class egg {Small,Medium,Large};
enum struct t_shirt {Small,Medium,Large};

猜你喜欢

转载自blog.csdn.net/zhczz1994/article/details/89478440