Chapter 2: Variables and Basic Types

  • 默认初始化
    如果定义变量时未对变量初始化, 变量会被默认初始化, 初始化所用的初始值由变量类型和变量定义的位置共同决定.
    定义在任意函数体之外的变量将初始化为0值; 定义在函数体之内的变量将不被初始化; 类类型的初始化由类自己决定(默认构造函数或自定义构造函数).

  • 复合类型的声明与定义
    通过基本数据类型, 类型修饰符, 声明符可以声明或定义复合类型
int *ptr = nullptr; // int为基本数据类型符, *为类型修饰符, *ptr为声明符
int **pptr = nullptr; // int为基本数据类型符, **为类型修饰符, **ptr为声明符
int &ref = value; // int为基本数据类型符, &为类型修饰符, &ptr为声明符
const int *ptr = nullptr; // const为类型限定符, 用于限定int类型, *ptr为声明符

  • 指针与引用的特点
    指针的特点是本身是一个对象占有内存空间, 并指向一个对象的内存空间(或nullptr).
    引用的特点是引用即别名, 本身不是对象, 不占内存空间.
    由于引用和指针都必须和对象(内存空间)关联, 所以指针和引用可以组合为:
int *ptr = nullptr; // 指针
int **pptr = nullptr; // 指向指针的指针
int &ref = value; // 引用
int *&refPtr = nullptr; // 关联指针的引用

不存在指向引用的指针, 和关联引用的引用(引用不是对象).


  • 关于const限定符
    const 限定符用于定义一种必要时可以调整大小, 但又不希望程序其他位置修改其大小的对象. const 对象的特点是一旦创建其值不再改变, 且必须初始化.

    • const 对象默认情况下只在文件内有效
      定义了一个const对象后编译器在编译时把用到该对象的地方都替换成对应的值. 那么在每一个使用了const 对象的地方都必须访问到它的初始值, 就必须在每个文件中重复定义const 对象. 所以const 对象默认只在定义它的文件内有效. 避免重复定义的方式是使用extern 声明. 在某个文件中定义const 对象, 在其他文件中用 extern const int value; 声明const 对象.
    • const 与指针和引用
    const int value1 = 0; // 语句1
    int value2 = 0; // 语句2
    const int &ref1 = value1; // 语句3
    const int &ref2 = value2;  // 语句4
    int &ref3 = value1; // 语句5

    语句1 定义了一个const对象, 语句2定义了一个非const 对象.
    语句3 定义了一个引用, 该引用关联的对象应当是一个const int 类型, 并且用const int 类型的value1 初始化该引用, 这是正确的. 通过名字ref1 可以访问value1 但不能修改value1的值, 通过名字value1也不能修改value1的值.
    语句4 定义了一个引用, 该引用关联的对象也应当是一个const int 类型, 但用非const int 类型的value2 初始化该引用, 这也是正确的. 通过名字ref2 可以访问value2 但不能修改value2的值.通过名字value2能修改value2的值.
    语句5 定义了一个普通引用, 却用const对象初始化它, 这样就有可能通过名字ref3修改const对象value1的值, 这是不允许的, 所以语句5错误.

const int value1 = 0; // 语句1
int value2 = 0; // 语句2
const int *ptr1 = &value1; // 语句3
const int *ptr2 = &value2; // 语句4
int *ptr3 = &value1; // 语句5
int *const ptr5 = &value1; // 语句6
int *const ptr6 = &value2; // 语句7
const *const ptr7 = &value1; // 语句8
const *const ptr8 = &value2; // 语句9

语句1 定义了一个const对象, 语句2定义了一个非const 对象.
语句3 定义了一个指针, 该指针指向的对象应当是一个const int 类型, 并且用const int 类型的指针&value1 初始化该指针, 这是正确的. 通过指针ptr1 可以访问value1 但不能修改value1的值, 通过名字value1也不能修改value1的值.
语句4 定义了一个指针, 该指针指向的对象也应当是一个const int 类型, 但用非const int 类型的指针&value2 初始化该指针, 这也是正确的. 通过指针ptr2 可以访问value2但不能修改value2的值.通过名字value2能修改value2的值.
语句5 定义了一个普通指针, 却用const对象的地址初始化它, 这样就有可能通过指针ptr3修改const对象value1的值, 这是不允许的, 所以语句5错误.
语句6 定义了一个指针, 该指针指向的对象是一个非const int类型, 但是用const类型的value1的地址初始化它, 这是错误的.
语句7 定义了一个指针, 该指针指向的对象是一个非const int类型, 用非const类型的value2的地址初始化它, 这是正确. 并且该指针本身是const类型的对象, 所以该指针所指向的地址一旦初始化就不能改变.
语句8和9 定义的是指向const对象的指针, 并且该指针本身也是const对象, 所以通过指针不能修改指向对象的值, 指针与指向对象的关系也不能改变.

对于const对象或者非const对象都可以定义指向const类型的指针, 但是对于const对象却不能定义指向非const类型的指针, 并且, 指针本身也可以定义成const类型的对象.

对于const对象或者非const对象都可以定义它的const引用, 但是对于const对象却不能定义它的普通引用.

  • 顶层const与低层const
    顶层const指const所修饰对象本身是常量, 低层const表示指针所指对象是常量.
    指针类型既有顶层const, 又有底层const.

  • 定义类型别名

    typedef int integer; // 使用typedef关键字, integer是int类型的别名
    using integer = int; // 使用别名声明, integer是int类型的别名
    
    //-----------------指针常量与类型别名---------------------------------
    typedef char* ptrString; // ptrString是char*类型的别名
    const ptrString str = nullptr; // str是一个常量指针, 指针指向char类型
    // 注意:不能认为const ptrString str 等价于 const char *str 

  • decltype类型指示符与auto类型说明符
    decltype的作用是推断并返回操作数的数据类型, 并且不实际计算表达式的值.
    auto的作用是在定义变量时让编译器通过初始值来推断变量类型.
    decltype和auto的区别在于对引用和顶层const的处理:
const int num = 1;
const int &refNum = num;
auto num1 = num; // auto忽略顶层const, num1是int类型
auto num2 = refNum; // auto忽略引用, 编译器使用引用对象的类型推断, num2是int
const auto num3 = num; // num3是const int
auto num4 = # // auto保留底层const, num4是指向整型常量的指针
decltype(num) num5 = 0; // decltype保留顶层const, num5是const int
decltype(refNUm) num6; // decltype保留引用, decltype(refNum)是引用类型, 引用类型必须初始化, 该句错误
decltype(refNum+0) num7; // (refNum + 0)是表达式, 其值为int类型, 故num7为int类型

decltype((variable)) 的类型始终是引用(双层括号)


  • 各算数类型需要注意的点
    • wchar_t, char16_t, char32_t
      wchar_t 表示宽字符, 该类型保证可以容纳该机器上最大的拓展字符集. char16_t 和char32_t 分别表示Unicode16和Unicode32字符.
    • char, unsigned char, signed char
      char, unsigned char, signed char 是三种不同的字符类型, 但是char 要么是unsigned char 要么是signed char, 具体由编译器决定.
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值