初始化与赋值

当对象在创建时获得了一个特定的值, 我们就说这个对象被初始化了. 在使用=号时, 如果创建了新的对象, 则为初始化而非赋值.
初始化不是赋值, 初始化的含义是创建变量时赋予其一个初始值, 而赋值的含义是吧对象的当前值擦除, 而以一个新值代替.

在使用列表初始化(C++11支持)时, 如果存在丢失信息的风险, 则编译器会报错.

默认初始化: 如果变量定义时没有指定初值, 则被默认初始化. 默认值由变量类型和变量定义的位置决定. 定义在任何函数之外的内置类型变量被初始化为0, 定义在函数体内部的内置类型变量将不被初始化.
定义在函数内的内置类型的对象如果没有初始化, 其值是未定义的.类对象如果没有显示初始化, 其值由类决定.

变量声明与定义

分离式编译允许将程序分割为若干个文件, 每个文件可被独立编译. 为了支持分离式编译, C++语言将声明和定义区分开来, 声明使得名字为程序所知, 如果一个文件想要使用别处定义的名字则必须包含对那个名字的声明, 而定义负责创建与名字关联的实体.
如果想声明一个变量而非定义它, 就在变量名前添加关键字extern且不要显示地初始化变量:

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

任何包含显式初始化的声明即成为定义. extern语句如果包含了初始值就不再是声明, 而变成定义了:

extern int i = 10;      //定义

在函数体内部, 如果试图初始化一个由extern关键字标记的变量, 将引发错误. 变量能且只能被定义一次, 但是却可以多次声明.
变量能且只能被定义一次, 但是可以被声明多次.
要在多个文件中使用同一个变量, 就必须将声明和定义分离, 变量的定义必须出现在且只能出现在一个文件中, 其他用到该变量的文件必须对其进行声明, 却绝对不能重复定义.

引用和指针

引用就是一个对象的别名, 引用必须初始化, 一旦初始化完成, 引用将和它的初始值对象一直绑定在一起, 无法令引用重新绑定到另外一个新的对象上.
引用并非对象, 他只是为一个已经存在的对象所起的另外一个名字而已.
引用本身不是对象, 因此无法定义引用的引用.
两种方法为指针置空

int *p = nullptr; // C++11标准推荐, 字面值类型
int *q = NULL     // 需要#include <cstdlib>, 预处理器变量
int *r = 0;       // OK, 初始化字面值常量0

现代C++程序最好使用nullptr, 避免使用NULL.

const限定符

初始化和const: 如果利用一个对象去初始化另一个对象, 则它们是不是const都无关紧要:

int i = 42;
const int ci = i;
int j = ci;

const常量特征只在构造完成时才生效, 因此初始化时可以给它一个初始值.
默认状态下, const对象仅在文件内有效, 如果想要在一个文件中定义它, 而在多个文件中声明并使用它, 解决的办法是对于const变量不管是声明还是定义都添加extern关键字.

extern const int bufSize = fcn(); // file1.cc定义并初始化一个常量, 该常量能被其他文件访问
extern const int bufSize;// file1.h中, 与file1.cc中是同一个bufSize

如果想在多个文件之间共享const对象, 必须在比变量的定义之前添加extern关键字.

可以把引用绑定到const对象上, 称之为对常量的引用, 对常量的引用不能被用作修改它所绑定的对象.

const int ci = 1024;
const int &r = ci; // 引用以及对应的对象都是常量
int i = 42;
const int &r2 = i; // 允许将const int &绑定到普通int对象上, 但是不允许通过r2改变i的值

如果const关键字出现在星号左侧, 表示被指物是常量, 如果出现在星号右侧, 表示指针自身是常量.

顶层const表示指针本身是个常量, 底层const表示指针所指的对象是一个常量.

constexpr和常量表达式

常量表达式(const expression)指值不会改变并且在编译过程中就能得到计算结果的表达式

类型别名

typedef int ElementType;
using ElementType = int; // C++11标准, 与typedef等价的定义

类型别名的错误理解

const char *pstring;
const pstring cstr = 0; // cstr是指向char的常量指针, 即cstr本身是const的不可改变, 但所指对象可以改变
const char *cstr2;      // cstr2是指向const char的指针, 即cstr2本身可以改变, 所指对象不可改变.

auto类型说明符:

auto让编译器通过初始值来推算变量的类型, 显然auto定义的变量必须有初始值.
使用引用类型推断结果是引用所绑定的对象的类型, 如果希望推断出引用类型必须明确指出.

int i = 0, &r = i;
auto a = r;  // a的类型为int 而非int &
auto &b = r; // b的类型为int &

auto一般会忽略掉顶层const, 同时底层const则会被保留下来

const int ci = i, &cr = ci;
auto b = cr;       // b是int类型 而非const int
const auto c = ci; // ci推断出是int, c是const int类型

decltype类型指示符

如果decltype使用的表达式是一个变量, 则decltype返回该变量的类型, 包括顶层const和引用在内.

const int ci = 0, &cj = ci;
decltype(ci) x = 0; // x类型为const int
decltype(cj) y = x; // y类型为const int &, 因此必须初始化
// 以下是decltype几个特殊用法
decltype(f()) sum = x; // x类型为f()返回值类型, f()并没有被调用
int i = 42, *p = &i, &r = i;
decltype(r + 0) b; // 加法结果是int, 因此b是未初始化的int
decltype(*p) c;  // 若表达式内容是解引用操作, 则得到引用类型, 因此c是int &, 必须初始化
decltype((i)) d; // 双层括号的结果永远是引用类型, 而单层括号只有当表达式是引用类型其结果才是引用类型

转载于:https://www.cnblogs.com/moon1992/p/7248031.html

[C++ Primer] 第2章: 变量相关推荐

  1. 《C++Primer》第二章-变量和基本类型-学习笔记(1)

    <C++Primer>第二章-变量和基本类型-学习笔记(1) 文章目录 <C++Primer>第二章-变量和基本类型-学习笔记(1) 摘要 主体 基本(内置)类型 算数类型 整 ...

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

    2.1 基本内置类型 算术类型(arithmetictype)和空类型(void)在内的基本数据类型.其中算术类型包含了字符.整型数.布尔值和浮点数.空类型不对应具体的值,仅用于一些特殊的场合,例如最 ...

  3. 《C++primer》第二章--变量和基本内置类型

    基本内置类型 如何选择类型的几点建议 当明确知晓数值不能为负数时,选用无符号类型 使用int进行整数运算.因为short一般表示的范围比较小,而long一般和int有相同的范围.如果表示的范围超过了i ...

  4. 《C++Primer》第九章-顺序容器-学习笔记(1)-顺序容器定义与操作

    <C++Primer>第九章-顺序容器-学习笔记(1) 文章目录 <C++Primer>第九章-顺序容器-学习笔记(1) 摘要 顺序容器的定义 容器元素的初始化 将一个容器初始 ...

  5. C++Primer读书笔记----第二章变量和基本类型

    前段时间学习iphone开发,非常力不从心,很多C/C++的类库代码看不明白.大学的时候都学过C/C++,但是基本上忘光了,现在做C#开发,经常写出来一些性能低下的代码,究其原因就是原理掌握不扎实,乱 ...

  6. C++ primer第五版学习记录:第二章变量和基本类型

    C++ primer第五版学习记录:第二章变量和基本类型 断断续续把第二章看完用了大概两周时间,发扬一下之前默写的传统,顺便让自己梳理一下该章节的具体框架及结构.可能会有理解错误的地方,欢迎大家批评指 ...

  7. c++ primer 第14章 习题解答

    14.1节 14.1答 不同点: 重载操作符必须具有至少一个class或枚举类型的操作数. 重载操作符不保证操作数的求值顺序,例如对&&和| | 的重载版本不再具有"短路求值 ...

  8. C++术语 【from C++ Primer 第1章 快速入门】

    C++术语 [from C++ Primer 第1章 快速入门] argument(实参) 传递给被调用函数的值. block(块) 花括号括起来的语句序列. buffer(缓冲区) 一段用来存放数据 ...

  9. C Primer Plus第二章总结

    C Primer Plus第二章总结 关于头文件: #include<stdio.h>可能是每一个初学者第一个看到的头文件,许多人可能不清楚什么是头文件以及头文件的功能 其实头文件是C语言 ...

最新文章

  1. dataframe 拆分 分裂
  2. Creating Lists
  3. [LeetCode]--118. Pascal#39;s Triangle
  4. Linux下判断字符串长度
  5. 从 Vue 1.x 迁移 — Vue.js
  6. 爬虫开发.1爬虫介绍
  7. FFmpeg API 变更记录
  8. Noip2011提高组 聪明的质监员
  9. 邬建国教授受聘为浙江大学光彪教授
  10. Meet Hadoop
  11. 联机系统的服务器,远程联机服务器系统
  12. 大数据以及Hadoop相关概念介绍
  13. win10系统mongodb 5.0安装配置+自动启动
  14. 服务器及存储产品默认管理IP地址及用户名密码
  15. MPII姿态估计性能评价标准-PCK
  16. CA策略发布目录SPC
  17. PythonStock(16):使用bokeh 展示,股票中的16个常用指标
  18. 消息中间件系列 - RabbitMQ
  19. 计算机二级使用多级符号对章名,计算机二级考试题目分析
  20. 对市场周期常存敬畏之心

热门文章

  1. 编写一个Java程序,在程序中包含一个Employee类,Employee类包含name、age、salary三个成员变量
  2. c语言中欧几里得模乘法逆元,扩展欧几里得算法同余方程模m乘法逆元详解
  3. oracle设置打印机,使用 Oracle Solaris 打印管理器设置网络连接的打印机
  4. Android之深入WebView
  5. 求php加密函数结果是超短的,寻求一种可逆加密算法,加密数据库自增主键,要求密文越短越好。...
  6. 上海地图全图可放大_好书·推荐丨第一次将近代上海行号与地图合并在路图中,你知道是哪本书吗?...
  7. gitblit无法启动服务
  8. Golang实践录:命令行cobra库实例
  9. 沉痛哀悼雷霄骅博士!
  10. cannot instantiate the type