变量和基本类型(C++Primer 5th)

字符型

  分为三种:char、signed char 和 unsigned char 。char 和 signed char并不一样,但字符的表现形式只有两种:带符号的和无符号的。

有符号与无符号

  注意: unsigned 类型和 int 类型的加法等运算。unsigned为负数时会出现异常,自动转换为无符号数。

对象

  通常情况下,对象是指一块能存储数据并具有某种类型的内存空间。

初始化

  初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来替代。

作用域

  预处理变量无视C++中作用域的规则。

extern

  如果想声明一个变量而非定义它,就在变量名前添加关键字extern,而且不要显示地初始化变量。
  任何包含了显示初始化的声明即成为定义,如:extern double pi = 3.1416 ; //定义。
  在函数体内部,如果试图初始化一个由extern关键字标记的变量,将引发错误。

标识符

  用户自定义的标识符中不能连续出现两个下划线,也不能以下划线紧连大写字母开头。此外,定义在函数体外的标识符不能以下划线开头。
  int _ ;(这个是正确的)

引用

   严格来说,当使用术语“引用(reference)”时,指的是左值引用(C++11引入了右值引用)。引用为对象起了另一个名字,定义引用时,程序将引用和初始值绑定在一起,而不是将初始值拷贝给引用。
  引用类型必须初始化,初始值必须是个对象而非数值,注意要同类型。错误示范:int &refVal =10;

指针

  指针和引用的对比:1、指针本身就是一个对象。2、指针无须在定义时赋初值。

  C++11标准下,空指针最好使用nullptr,同时尽量避免使用NULL。

  不能直接操作 void* 指针所指的对象。

int ival = 42 ;                 // 指向必须同类型
int *p = &ival;                 // p存放变量ival的地址,或说p是指向变量ival的指针。
int **pi = &p;                  // pi指向一个int型的指针,表示指向指针的指针int *p = nullptr ;              // 等价于int *p =0 ;int* p1,p2 ;                    // 注意p1为指针,p2为int变量int *&r = p;                    // r是一个对指针p的引用
const

  const对象必须初始化。默认情况下,const对象被设定为仅在文件内有效。
  顶层const(top-level const)表示指针本身是个常量,底层const(low-level const)表示指针所指的对象是一个常量。

// const引用
const int ci = 1024;
const int &r1 = ci;             // 正确引用,引用及其对象都是常量
int &r2 = ci;                   // 错误引用,试图让非常量引用指向一个常量对象int &r = 0 ;                    // 错误
const int &r = 0;               // 正确// const指针
int errNumb =0;
int *const curErr = &errNumb;   // curErr将一直指向errNumb,可以通过*curErr修改errNumb的值const double pi = 3.14159;
const double *const pip = π  // pip是一个指向常量对象的常量指针,不能通过*pip修改pi的值const int *p;                   // 合法,但p没有指向任何实际的对象// 顶层const OR 底层const
int i =0;
int *const p1 = &i;             // 顶层const,p1的值不能改变
const int ci = 42;              // 顶层const,ci的值不能改变
const int *p2 = &ci;            // 底层const,p2的值允许改变
const int &r = ci;              // 底层const,用于声明引用的const都是底层const
constexpr

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

constexpr int mf = 20;          // 20是常量表达式
constexpr int limit = mf + 1;   // mf + 1 是常量表达式
constexpr int sz = size();      // 仅size()是constexpr函数时才正确constexpr const int *p = &i;    // p是常量指针,指向整型变量i
constexpr int *p1 = &j;         // p1是常量指针,指向整数j
类型别名

  传统的方法是使用关键字 typedef,新标准使用别名声明即关键字using来定义别名。

typedef double wages;           // wages是double的别名
typedef wages base,*p;          // base是double的别名,p是double*的别名using SI = Sales_items;         // SI是Sales_item的别名

auto

  C++新标准引入了auto类型说明符,auto让编译器通过初始值来推算变量的类型,因此,auto定义的变量必须有初始值。
  一条声明语句中,所有变量的初始基本数据类型必须保持一致。
  auto一般会忽略掉顶层const,同时保留底层const,如对常量对象取地址是一种底层const。

auto item = val1+val2;          // 初始化auto i = 0, *p = &i;            // 正确:i是整数,p是整型指针
auto sz =0, pi = 3.14;          // 错误:sz和pi的类型不一致 auto c = &ci;                   // c是一个指向整数常量的指针,底层const
const auto f = ci;              // 顶层const
auto &n =i,*p2 = &ci;           // 错误:i 是 int,而 &ci 是 const int
decltype

  作用是选择并返回操作数的数据类型,不计算表达式的值(与auto不同),意思是,从表达式类型推断要定义的变量类型,同时又不希望用该表达式的值初始化变量。
  需要指出的是,引用从来都作为其所指对象的同义词,只有用在decltype处是个例外。
  decltype的表达式如果是加上了括号的变量,结果将是引用。

decltype(f()) sum = x;          // sum的类型就是函数f的返回类型const int ci = 0,&cj = ci;
decltype(ci) x = 0;             // x的类型是const int
decltype(cj) y = x;             // y的类型是const int&,y是引用,必须初始化
decltype(cj+0) a;               // 正确,类型为int,r为表达式r+0的一部分int i = 42;
decltype((i)) b;                // 错误,b为引用,即int&,必须初始化
decltype(i) c;                  // 正确,c为一个未初始化的int

auto和decltype的区别主要有三个方面:
第一,auto类型说明符用编译器计算变量的初始值来推断其类型,而decltype虽然也让编译器分析表达式并得到它的类型,但是不实际计算表达式的值。
第二,编译器推断出来的auto类型有时候和初始值的类型并不完全一样,编译器会适当地改变结果类型使其更符合初始化规则。例如, auto —般会忽略掉顶层const,而把底层const保留下来。与之相反,decltype会保留变量的顶层const。
第三,与auto不同,decltype的结果类型与表达式形式密切相关,如果变量名加上了一对括号,则得到的类型与不加括号时会有不同。如果decltype使用的是一个不加括号的变量,则得到的结果就是该变量的类型;如果给变量加上了一层或多层括号,则编译器将推断得到引用类型。





【C++笔记】变量和基本类型相关推荐

  1. python 疯狂讲义 笔记(变量和基本类型)

    2.变量和简单类型: Python 是 一 门弱 类型语言 ,弱类型包含两方面的 含义 : 1所有的变量无须声明即可使用,或者说对从未用过的变量赋值就是声明了应变量;2变量 的数据类型可以随时改变,同 ...

  2. C++菜鸡笔记--变量与基本类型

    C++变量与类型 类型 基本内置类型 布尔型 整型 浮点型 字符和字符串类型 变量 变量的定义 变量的命名 变量的初始化 常量 复合类型 引用 指针 const限定符 类型处理 类型别名 auto类型 ...

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

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

  4. C++ Primer 5th笔记(2)chapter 2变量和基本类型:constexpr 、auto、类型别名、decltype

    1.constexpr和常量表达式 1.1 常量表达式 定义:变量的值在编译器的时候就可以得到是一个常量 eg. const int i = 0; 1.2 constexpr变量 让编译器来验证变量的 ...

  5. C++ Primer 5th笔记(2)chapter 2变量和基本类型:变量声明、关键字

    0. 几个零星知识点 . 嵌套作用域:局部变量会覆盖全局变量 . char 在有些机器有符号,有的无符号. . 标识符大小写敏感. 1.变量声明和定义 c++ 将声明和定义分开来. 声明 extern ...

  6. Chapter2(变量和基础类型)--C++Prime笔记

    数据类型选择的准则: ①当明确知晓数值不可能为负时,选用无符号类型. ②使用int执行整数运算.在实际应用中,short常常显得太小而long一般和int有一样的尺寸.如果运算范围超过int的表示范围 ...

  7. 《C++ Primer 5th》笔记(2 / 19):变量和基本类型

    文章目录 基本内置类型 算术类型 内置类型的机器实现(类型在物理层面上的说明) 建议:如何选择类型 类型转换 建议:避免无法预知和依赖于实现环境的行为 算术表达式里使用布尔值 含有无符号类型的表达式( ...

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

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

  9. ElasticSearch 6.x 学习笔记:12.字段类型

    ElasticSearch 6.x 学习笔记:12.字段类型 欢迎转载. https://blog.csdn.net/chengyuqiang/article/details/79048800 12. ...

最新文章

  1. 减肥登Cell封面上热搜:华东师大热疗探索新突破,这一波网友们想象力大开
  2. Go 语言编程 — 高级数据类型 — Slice 切片
  3. OpenGL EnvironmentMapping环境映射的实例
  4. hibernate状态_Hibernate状态的自然身份证
  5. redis 和 数据库mysql之间的关系
  6. libevent c++高并发网络编程_高并发编程学习(2)——线程通信详解
  7. 【jQuery】学习整理(一) 认识jQuery
  8. python模型训练框架_以Python撰写 AI模型框架
  9. 算术编码python实现_算术编码(Arithmetic coding)的实现
  10. 带壳破解SMC补丁技术
  11. java成员变量是什么
  12. 技术分享 | 关于Prometheus自主无人机开发你需要懂得一些“小事”(上)
  13. 【收藏】10个高能黑科技网站
  14. Wifi-direct 相关记录
  15. python 全栈开发,Day86(上传文件,上传头像,CBV,python读写Excel,虚拟环境virtualenv)
  16. 学计算机会不会做ppt,学习计算机心得与体会.ppt
  17. 当代年轻人到底怎么跨越阶层?
  18. beeline 参数
  19. python实现梯度下降法
  20. 使用jersey框架上传图片到图片服务器

热门文章

  1. gd32 定时器时钟_漫谈LiteOS之开发板-Timer(基于GD32450i-EVAL)
  2. eclipse svn插件安装_PHP 安装
  3. php友情链接大于3换行,细节见真情 PHPWind v5.3友情链接功能改进
  4. git代码库迁移保留commit历史_如何把git仓库(包含所有提交历史)迁移到gitlab
  5. jQuery 配置和基本语法
  6. string的find( )函数✅
  7. 计算机视觉中的注意力机制的学习笔记
  8. java9模块不可见问题
  9. 带黑洞的随机游走问题
  10. 以后别写程序了,几个程序员很有用的源码网站奉献给大家