C++复合类型

数组:用来存储多个同种数据类型的数据格式,元素在内存中的存储是连续的,可以使用sizeof运算符得到数组所占内存的大小。

数组创建:类型,数组名,元素个数//typeName arrayName [ arraynum ] ;

数组元素访问:arrayName [ 0~arraynum-1 ] // 数组下标值超出范围并不会被编译器指出

数组赋值:未被赋值时,数组存储的是开辟空间内之前存储的值,其数值是不确定的

  • 只有在初始化时可以采用列表赋值法({num1,num2,num3,……}),列表元素超出数组元素时编译器报错,小于数组元素时未定义的元素赋值为0;
  • 可以针对每一个元素单独赋值,数组定义后每个元素实际上是一个数组指定类型的变量,可以进行该类型变量的所有操作。
  • 使用列表初始化创建数组时的,可以省略对数组元素个数的定义,这个时候数组大小将由编译器和初始化用到的列表值共同定义。

C++中新增的数组规范:

  • 初始化数组时可以省略“=”;
  • 使用“{}”初始化将所有元素被初始化为0;
  • 初始化时禁止类型缩窄(范围,精度)。

字符串

C风格字符串:一种特殊格式的字符数组(最后一个元素为 '/0' )

字符串常量:双引号 "" 引起的一串字符,结尾自动隐式包含 '/0' ,键盘输入的也将在末尾自动添加 '/0';两个字符串之间如果以空白隔开,则合并为一个字符串(将第一个字符串结尾的 '/0' 替换为第二个字符串) //“abc”实际上有4个字符。

  • 要表示wchar_t,char16_t,char32_t等字符串时,其字符常量应该在字符串常量前面加上L,u,U前缀;
  • 原始类型的字符串常量,不需要使用转义字符。

字符串初始化

  1. 方式一:使用数组的初始化方式,但是最后一个字符必须为 '/0' ;
  2. 方式二:使用字符常量初始化字符串,不限制字符串长度,可以不设定元素数量,编译器自动确定元素数量。
  3. 方式三:键盘输入存到数组
  • cin 遇到空白停止输入;
  • cin.getline(数组名,长度) 遇到换行符停止,但并不会在数组中存储换行符,而是在字符串后面存储 '/0';如果字符串比分配的空间长,剩下的输入会继续放在输入缓存区,同时cin.getline()会设置失效位,关闭后面的输入。
  • cin.get(name,size)到换行符停止,但并不读取换行符,换行符仍在输入缓冲区(输入数字时也会将换行符遗留在输入区),等待读取;cin.get()可以读取一个字符,包括换行符。读到空行后会产生将cin的状态标记为错误,将无法继续使用cin进行输入,可以使用cin.clear()重置标记位。

C++字符串:string类

        string类与C风格字符串的区别是string类对象不再是一个数组,而是简单变量,并且C风格字符串初始化后其所占内存大小将被固定不能被改变,而string类对象的大小则是可调整的。

  • 像C风格字符串支持使用下标访问,并可以使用C风格字符串赋值;
  • 拥有简单变量的优点,可以直接完成string类对象之间的赋值,无论其长度是否相等;
  • 可以使用 ‘+’ 运算符拼接类对象或类对象与C风格字符串。

结构体:可以存储多种不同数据类型的数据,在内存中是连续的,但不同元素之间可能存在间隙。

实际上是使得语言使用者拥有了定义复合数据类型的权限,所以结构体的创建需要分两步来完成。

1、创建结构的格式规范:所创建的结构的类型类型名称,以及该结构中涉及到的不同数据类型的定义;

struct newtype
{
    typename s1;
    typename s2;
    ……
};

newtype a = {……};
std::cout << a.s1;
  • typename可以是:基础数据类型,数组(包括结构体数组),字符串,结构体(除当前定义的结构体类型)

2、使用自己定义的数据类型创建实体对象//newtype blname;

  • 与基础数据类型一样,结构体可以使用列表初始化数据,同时同一类型结构体之间可以互相赋值(虽然可能包含数组,但是同一类型结构体数组的长度肯定是一样的)。

3、结构体成员的访问:每个结构体可以看作相应类型的变量,可以使用成员运算符(.)对其进行访问//a.s1;


共用体:一种数据格式,同一个内存可以用来存不同数据类型的值,相当于一个可以是多种类型的变量。

定义:和结构体相似,首先定义该内存内可能存储的数据类型,变量名称,内存由其中最大的类型来决定。

创建实体后通过成员运算符(.)对共用体进行访问。

#include <iostream>
using namespace std;
union yy
{
    int a;
    double b;
    char c[20];
};
int main()
{
    yy s1;
    s1.a = 5;
    cout << s1.a << endl;
    cout << &(s1.a) << endl;
    s1.b = 66.66;
    cout << s1.a << endl;
    cout << s1.b << endl;
    cout << &(s1.b) << endl;
    return 0;
}


枚举量:一种新型的创建符号常量的方法。

定义新类型:定义新类型名称,定义该类型涵盖的符号常量,枚举量只能是整型。

  • 默认情况下,第一个枚举量为0,依次加1;
  • 可以显式地定义枚举量的值,显式定义后,后续枚举量的值以定义值为起点依次加1;
  • 枚举类型取值最大值为能够表示枚举量的二进制数的位数所能表示的最大值,没有非负数时,最小范围为0,有负数按照最小值的计算方法进行计算。
​#include <iostream>
using namespace std;
int main()
{
    enum mj{happy,creazy=0,sad=100,boring};
    mj c = happy;
    cout << c << endl;
    mj d = mj(64);
    cout << d << endl;
    return 0;
}

        枚举量作为整型可以被提升为 int类型,但int类型不能转换为整型,同时枚举类型没有定义运算符。所以:

  • 枚举量可以互相赋值但不能运算,枚举量可以赋值给int整型,但反之不行;
  • 枚举量之间不能进行运算,但是枚举量可以和int整型进行运算。

  • 31
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值