• C++ 是一种静态数据类型语言,它的类型检查发生在编译时。因此,编译器需要知道每一个变量对应的数据类型。

2.1 基本内置类型

  • 算术类型

  • C++ 标准并没有规定带符号类型应如何表示,但是约定了在表示范围内正值和负值的量应当平衡。
  • 如何选择类型

  • 类型转换

  • 当一个算数表达式中既有无符号数又有 int 值时,int 值会转换成无符号数。
  • 默认情况下,十进制面值是带符号数,八进制和十六进制字面值既可能是带符号的也可能是无符号的。
  • 转义字符序列被当成是一个字符使用。

  • 指定字面值的类型

2.2 变量

  • 通常情况下,对象是指一块能存储数据并具有某种类型的内存空间。
  • 初始化 int a = 0, b(0), c = {0}, d{0};
  • 用花括号初始化变量的方法叫做列表初始化,使用列表初始化并且初始值存在丢失的风险时,编译器将报错/警告。
  • 默认初始化

    内置类型:函数之外,初始化为 0;函数之内,不被初始化。

    对象:每个类各自决定初始化对象的方法。
  • C++ 支持分离式编译,允许将程序分割为若干文件,每个文件单独编译。为支持分离式编译,C++ 将声明与定义区分开来。
  • 变量声明规定了变量的类型和名字,定义除此之外还申请空间,也可能会为变量赋初始值。
  • 如果想声明一个变量而非定义它,在变量名前加关键字 extern,例如 extern int a;。
  • 变量只能定义一次,但是能声明多次。
  • C++ 大多数作用域以花括号分隔,同一名字在不同作用域可能指向不同实体,名字的有效区域起始于名字的声明语句,以声明语句的所在作用域末端为结束。
  • 作用域操作符 ::,全局作用域本身没有名字,因此当作用域操作符左边为空时,访问全局变量。

2.3 复合类型

  • 通过将声明符写成 &d 的形式来定义引用类型。
  • 引用必须初始化,一旦初始化完成,引用将和它的初始值对象绑定在一起。
int a = 0, &b = a;
int c = b; // ok
int d = &b; // invalid conversion from 'int*' to 'int'
int &e = b; // ok
int &f = a * 2 // 不能与表达式绑定
  • 除特殊情况,所有引用 / 指针的类型都要和与之绑定的对象严格匹配。
  • 引用只能绑定到对象上,不能与字面值或某个表达式的计算结果绑定。
  • 指针与引用的区别

    指针本身就是一个对象,允许对指针赋值和拷贝,生命周期内可以先后指向不同的对象;

    指针无须在定义时赋初始值。
  • 通过将声明符写成 *d 的形式来定义指针类型。
int a = 0;
int *p1 = &a;
int *p2 = p1;
int i = 0;
int *p1 = 0; // ok
int *p2 = i; // invalid conversion from 'int' to 'int*'
double *p3 = &i; // cannot convert 'int*' to 'double*' in initialization
  • 指针值
  1. 指向一个对象;
  2. 指向紧邻对象所占空间的下一个位置;
  3. 空指针,没有指向任何对象;
  4. 无效指针,编译器不检查此类错误。
  • 取地址操作符 &,解引用符 *。

  • 空指针 int *p = nullptr;
  • void* 指针可以存放任意对象的地址,不能直接操作void* 指针所指的对象。
  • 一条定义语句可能定义出不同类型的变量,虽然基本数据类型一样,但是声明符的形式可以不同。
int i = 0, *p = &i, &r = i;
// i 是一个 int 型的数,p 是一个 int 型指针,r 是一个 int 型引用
  • 通过 * 的数目区别指针的级别,比如, ** 表示指向指针的指针, *** 表示指向指针的指针的指针。
  • 指向指针的引用
int i = 0, *p, *&r = p;
// 最接近 r 的符号是 &,表示 r 是一个引用
// * 说明 r 引用的是一个指针
r = &i; // 令 p 指向 i
*r = 1; // 将 i 的值改为 1

2.4 const 限定符

  • const:变量的值不能改变,const 对象必须初始化。
  • 默认情况下,const 对象被设定为仅在文件内有效。当多个文件出现同名的 const 变量时,等同于在不同文件中分别定义了独立的变量。如果希望只在一个文件中定义 const 对象,方法是对于 const 对象,不管是声明还是定义,都添加 extern 关键字。
  • 允许一个常量引用(对 const 的引用)绑定到非常量的对象、字面值,甚至是一般表达式。
  • 当一个引用不是一个常量引用时,不可以绑定一个临时量。
double dval = 3.14;
const int &r = dval; // 将 r 绑定了临时量 `int tmp = dval`
int &r2 = dval; // 绑定 tmp 而不是 dval,无法通过改变 r2 来改变 dval
  • 指向常量的指针不能用于修改其所指对象的值。
int a = 1;
int *p1 = &a; // ok
const int b = 1;
int *p2 = &b; // wrong
const int *p3 = &b; // ok
  • 常量指针,指针本身是常量,必须初始化,一旦初始化,值不能改变,这里的不变的是指针本身的值而不是指向的对象。
int a = 0;
int *const p = &a;
// 与 p 最近的是 const,说明 p 本身不变,是个常量
// * 说明 p 是一个指针
  • 顶层 const:指针本身是个常量;底层 const:指针所指的对象是一个常量。
  • 执行对象的拷贝操作时,顶层 const 不受什么影响,底层 const 有限制:必须具有相同的底层 const 资格,或者数据类型能够转换。
  • 常量表达式:值不会改变并且在编译的过程就能得到计算结果。
const int a = 1; // 是
const int b = a + 1; // 是
int c = 1; // 不是
const int d = fun(); // 不是
  • 允许将变量声明为 constexpr,表示是一个常量,必须用常量表达式初始化。

2.5 处理类型

  • 类型别名
typedef double a, *b; // a 是 double 的同义词,b 是 double* 的同义词
using a = double // a 是 double 的同义词
typedef char *pstring;
const pstring cstr = 0; // cstr 是指向 char 的常量指针
const pstring *ps; // ps 是一个指针,它的对象是指向 char 的常量指针
  • auto:让编译器通过初始值推断变量的类型,定义时必须有初始值。
  • auto 一般会忽略掉顶层 const,保留底层 const,希望保留顶层 const 需要明确指出。
const int ci = 1;
const auto f = ci;
  • decltype 选择并返回操作数的数据类型。

2.6 自定义数据结构

  • #define 指令把一个名字设定为预处理变量,#ifdef 指令当且仅当变量已定义时为真,#ifndef 指令当且仅当变量未定义时为真,#endif 指令结束预处理。

C++ Primer 5 CH2 变量和基本类型的更多相关文章

  1. <<C++ Primer>> 第二章 变量和基本类型 术语表

    术语表 第 2 章 变量和基本类型 地址(address): 是一个数字,根据它可以找到内存中的一个字节    别名生命(alias declaration): 为另一种类型定义一个同义词:使用 &q ...

  2. 《C++ Primer》 ---- 关于变量 与 基本类型

    类型是所有程序的基础;    C++ 定义了几种基本类型: 字符型(char 和 wchar_t),整型(short int long bool),浮点型(float doubel) 并且提供自定义数 ...

  3. C++ Primer 读书笔记 第2章 变量和基本类型

    C++ Primer 第二章 变量和基本类型 2.1 基本内置类型 C++定义了一组表示整数.浮点数.单个字符和布尔值的算术类型(arithmetic type),此外还定义了Void类型. 算术类型 ...

  4. 再读《C++ Primer》——变量和基本类型

    刚上大学那时,几个室友一块买了本<C++ Primer>第4版,看了一遍后就没怎么碰了,偶尔拿出来翻翻,当作工具书使用.后来知道有第5版了,一直觉得内容差不多吧.直到最近,再读其中的一些内 ...

  5. C++ Primer 第2章 变量和基本类型

    C++ Primer 第2章 变量和基本类型 C Primer 第2章 变量和基本类型 1 基本内置类型 算数类型 类型转换 字面值常量 2 变量 变量定义 3 复合类型 引用d左引用 指针d 4 c ...

  6. C++ Primer 笔记(2)第二章 变量与基本类型

    第二章 变量与基本类型 1.基本内置类型包括算术类型和空类型,算术类型分为两类:整型(包括字符和布尔类型)和浮点型: 2.布尔类型(bool)的取值是真(true)或者假(false): 3.字面值常 ...

  7. C++ Primer : 第二章:变量和基本类型(1)

    变量和基本类型之第一篇:基本内置类型和变量 一. (1) C++定义了一套包括算数类型和空类型,这些类型有:布尔类型bool,字符类型char,宽字符类型wchar_t,Unicode字符char16 ...

  8. C++ Primer 学习笔记_5_变量和基本类型(续2)

     变量和基本类型 七.枚举 枚举不但定义了整数常量集,并且还把它们聚集成组. 枚举与简单的const常量相比孰优孰劣, 通过以下一段代码. 一看便知: enum {input, output, a ...

  9. C++拾遗(一)——变量和基本类型

    今天看到一个小小的算法,交换两个数却不引入中间变量,想了下没什么思路.看了答案是这样: int a, b; a = a + b; b = a - b; a = a - b; 感觉还是挺有想法的,借此也 ...

随机推荐

  1. iOS网络层设计感想

    App的开发无外乎从网络端获取数据显示在屏幕上,数据做些缓存或者持久化,所以网络层极为重要.原来只是把AFNetwork二次封装了一下,使得调用变得很简单,并没有深层次的考虑一些问题. 前言 参考: ...

  2. MongoDB基础之十 shared分片

    水平分片实例分布图: mongodb sharding 服务器架构   1. 添加mongdb两个shared实例 # mkdir -p /home/m17 //home/m18 /home/m20 ...

  3. ArcGIS制图表达Representation-规则和几何效果

    ArcGIS制图表达Representation-规则和几何效果 by 李远祥 对制图表达运用是否纯熟,主要是看对制图表达规则的理解和巧妙运用.前面章节已经粗略介绍过制图表达的运用,通过一些简单的规则 ...

  4. 深入子元素的width与父元素的width关系

    深入理解父元素与子元素的width关系 对于这一部分内容,如果理解准确,可以更容易控制布局,节省不必要的代码,这里将简单研究. 第一部分:父子元素都是内联元素 代码演示如下: <!DOCTYPE ...

  5. Jquery AutoComplete实现搜索自动完成

    AutoComplete控件就是指用户在文本框输入前几个字母或是汉字的时候,该控件就能从存放数据的文本或是数据库里将所有以这些字母开头的数据提示给用户,供用户选择,提供方便. 例子: <!doc ...

  6. Git学习之路(5)- 同步到远程仓库及多人协作问题

    ▓▓▓▓▓▓ 大致介绍 我们写好文件后添加到版本库,但是这样还没有做完,我们还需要将它同步到GitHub的远程仓库上,这里就以我们刚开始的drag项目为例,我们在Git学习之路(2)-安装GIt和创建 ...

  7. JavaScript中国象棋程序(6) - 克服水平线效应、检查重复局面

    "JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第6节. 这一系列共有9个部分: 0.JavaScript中国象 ...

  8. 酷派8702手机打开logcat

    机器在出厂时将log的级别做了限制,方法是:拨号盘输入*20121220# -> 选择日志输出级别 -> 选择Java log level -> 选择LOGD即可.

  9. 继BAT之后 第四大巨头是谁

    中国互联网三大巨头的位置,毫无疑问是属于百度腾讯阿里的,但在它们之后,哪家公司能进巨头之列?京东布局不错,走亚马逊路线:360同时占据传统和移动互联网两大领域入口:小米软硬整合,生态系统完整. 很多人 ...

  10. c#模拟js escape方法(转)

    实现URI字符串转化成escape格式的字符 public static string Escape(string s)         {             StringBuilder sb ...