C++ Primer Chapter2 变量和基本类型

第二章 变量和基本类型

声明:
本文为《C++ Primer 中文版(第五版)》学习笔记。
原书更为详细,本文仅作学习交流使用,未经授权禁止转载。

在公众号【Jacen的技术笔记】,回复 C++,即可获得 两万字C++ Primer 要点整理PDF。

P30-P71

数据类型是程序的基础。C++语言支持广泛的数据类型。

基本内置类型

算术类型

类型 最小尺寸
bool 未定义
char 8位
w_char_t 16位
char16_t 16位
char32_t 32位
short 16位
int 16位
long 32位
long long 64位
float 6位有效数字
double 10位有效数字
long double 10位有效数字

类型转换

不要混用符号类型和无符号类型。

变量

变量定义

(1)基本形式:

类型说明符,随后紧跟着一个或者多个变量名组成的列表,其中变量名以逗号分隔,最后以分号结束。

(2)初始值

在C++中,初始化和赋值是2个完全不同的操作。初始化的含义是创建变量的时候赋予一个初始值,而赋值的含义是把对象的当前值擦除,用一个新值来替代。两者区别很小。

(3)列表初始化

用花括号来初始化变量的方式,称为列表初始化。

(4)默认初始化

如果定义变量没有指定初始值,则变量被默认初始化。

::: tip

例外情况:

定义在函数体内部的内置类型变量将不被初始化,其值未定义。

建议初始化每个内置类型的变量。
:::

变量声明和定义的关系

变量声明:规定了变量的类型和名字。

变量定义:除声明之外,还需要申请存储空间。

如果想声明一个变量,而非定义它,需要使用extern关键词。

extern int i;    // 声明i而非定义i
int j;           // 声明并定义j

::: tip
变量只能被定义一次,但可以被多次声明。
:::

名字的作用域

作用域:C++中大多数作用域都用花括号分隔。

作用域中一旦声明了某个名字,它所嵌套的所有作用域都能访问该名字。同时,允许在内层作用域中重新定义外层作用域中有的名字。

::: warning
如果函数有可能用到某全局变量,则不宜再定义一个同名的局部变量。
:::

复合类型

定义:
复合类型是基于其他类型定义的类型。

引用

引用:为对象起另外一个名字。

::: warning
引用必须被初始化。
引用本身不是对象,所以不能定义引用的引用。
引用要和绑定的对象严格匹配。
引用类型的初始值,必须是一个对象。
:::

指针

指针:本身就是一个对象。允许对指针赋值和拷贝。指针无须在定义的时候赋值。

(1)利用指针访问对象

如果指针指向了一个对象,则允许使用解引用符(*)来访问该对象。

(2)void* 指针

理解复合类型的声明

(1)指向指针的指针

** 表示指向指针的指针

*** 表示指向指针的指针的指针

(2)指向指针的引用

不能定义指向引用的指针。但指针是对象,所以存在对指针的引用。

const限定符

定义:const用于定义一个变量,它的值不能被改变。const对象必须初始化。

::: tip

默认状态下,const对象仅在文件内有效。当多个文件出现了同名的const变量时,等同于在不同文件中分别定义了独立的变量。

如果想让const变量在文件间共享,则使用extern修饰。

:::

(1)const的引用

允许为一个常量引用绑定非常量的对象、字面值,甚至是个一般表达式。

一般,引用的类型必须与其所引用对象的类型一致,特殊情况是表达式。

(2)指针和const

弄清楚类型,可以从右边往左边阅读。

(3)顶层const

top-level const 表示指针本身是个常量

low-level const表示指针所指的对象是一个常量。

(4)constexpr和常量表达式

C++新标准规定,允许将变量声明为constexpr类型以便由编译器来验证变量的值是否是一个常量表达式。

处理类型

类型别名

两种方法用于定义类型别名:

(1)使用关键词typedef

typedef double wages; //wages是double的同义词
typedef wages *p; // p是double*的同义词

(2)别名声明

using SI = Sales_item;  // SI是Sales_item的同义词

auto类型说明符:让编译器通过初始值来推算变量的类型。

decltype类型指示符:选择并返回操作符的数据类型。只得到类型,不实际计算表达式的值。

自定义数据结构

(1)类

数据结构是把一组相关的数据元素组织起来,然后使用它们的策略和方法。

类一般不定义在函数体内,为了确保各个文件中类的定义一致,类通常被定义在头文件中,而且类所在头文件的名字应该与类的名字一样。

头文件通常包含那些被定义一次的实体。

(2)预处理器

#ifndef SALES_DATA_H
#define SALES_DATA_H
#endif

一般把预处理变量的名字全部大写。

术语

空指针 :值为0的指针,空指针合法但是不指向任何对象。nullPtr是表示空指针的字面值常量。

void*:可以指向任意非常量的指针类型,不能执行解引用操作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容