刚上大学那时,几个室友一块买了本《C++ Primer》第4版,看了一遍后就没怎么碰了,偶尔拿出来翻翻,当作工具书使用。后来知道有第5版了,一直觉得内容差不多吧。直到最近,再读其中的一些内容,结合自己曾经所学所用,很多地方都想得更深了。结合C++11,也有很多新的发现。人就是在不断否定过去的自己中成熟的。

以下是书的第2章,变量和基本类型,的一些笔记。

一、基本内置类型

基本数据类型包括算数类型(arithmetic type)和空类型(void)。

书中列出了每种类型的最小存储空间,在不同机器上这些类型的存储空间可能会不同,在程序中怎么获得实际的大小呢

C++中有个关键字 sizeof ,可以获得一个类型对应对象的大小(以字节byte为单位)。具体细节参考sizeof

1.算术类型

算术类型分为整型和浮点型。

表示整数、字符和布尔值的算数类型称为整型(integral type)。

char类型通常是单个机器字节,wchar_t用于扩展字符集,比如汉字和日语。

通常,short为半个机器字长,int为一个机器字长,long为一个或两个机器字长(跟操作系统有关)。

2.类型转换

注意有符号数转换为无符号数时可能会出现的问题。

比如:

for (unsigned i = 10; i >= 0; --i)
	std::cout << i << std::endl;

上面的程序中,i永远也不会小于0,循环条件一直成立。

分析:当i减小到0时,经过一次循环,i再减一,值为-1,-1不满足无符号数的要求,将被自动转换成一个合法的无符号数。

计算机中有符号数是用补码表示的,如果int类型占32位,那么-1的补码是32个1(负数符号位是1,其余各位取反,再在末位加1),转换成无符号数也就是232-1,所以当i等于0时,--i的结果将会是4294967295。

二、变量

1.初始化

一种特殊的初始化方式:列表初始化。

比如:int units_sold = {0};

如果我们使用列表初始化,并且初始值存在丢失信息的风险,编译器将会报错:

long double ld = 3.14159;
int a{ ld };

2.声明和定义

定义(definition):为变量分配存储空间,也可以为变量指定初始值。

声明(declaration):用于向程序表明变量的类型和名字。定义也是声明。

可以使用 extern 关键字声明变量而不定义它。

只有当extern声明位于函数外部时,才可以含有初始化式。

三、复合类型

复合类型主要是引用和指针。

1.引用

引用为对象起了另外一个名字,引用类型引用另外一种类型。定义引用时,程序把引用和它的初始值绑定在一起(不是将初始值复制给引用),无法令引用重新绑定到另外一个对象。

引用不是对象,引用不是对象,引用不是对象,重要的话说三遍!它只是已有对象的别名,所以不能定义引用的引用。而且引用的类型要和与之绑定的对象严格匹配。

2.指针

生成空指针的几个方法:

int *p1 = nullptr;
int *p2 = 0;
int *p3 = NULL;

nullptr 是C++11新标准引入的,它是一种特殊的字面值。

以前我一直是用NULL来生成空指针,NULL是一个预处理变量,在头文件cstdlib中定义,它的值就是0。

在新标准下,现在最好是用nullptr。

四、const限定符

1.const的引用

允许为一个常量引用绑定非常量的对象、字面值。

int i = 42;
const int &r1 = i;

2.指针和const

指向常量的指针:

const double a = 3.14;
const double *ptr = &a;

const指针:

int b = 3.14;
int *const ptr = &b;

指针本身是一个常量,不代表不能通过指针修改其所指向的对象的值。

3.顶层const

顶层const:指针本身是个常量。

底层const:指针所指的对象是一个常量。

五、处理类型

1.类型别名

方法1:使用typedef关键字

typedef double wages;

方法2:使用别名声明

using SI = Sales_item;

方法2是新标准中的。

2.auto类型说明符

让编译器分析表达式所属的类型,auto定义的变量必须有初始值。

3.decltype

选择并返回操作数的类型。

decltype(f()) sum = x;

sum的类型就是函数f的返回类型。

再读《C++ Primer》——变量和基本类型的更多相关文章

  1. C++ Primer 变量和基本类型

    <C++ Primer 4th>读书摘要 基本上所有的语言都要提供下列特征: • 内置数据类型,如整型.字符型等. • 表达式和语句:表达式和语句用于操纵上述类型的值. • 变量:程序员可 ...

  2. 再读c++primer plus 004

    第九章  内存模型和名称空间 1.如果文件名包含在尖括号中,则c++编译器将在存储标准头文件的主机系统的文件系统中查找,但如果文件名包含在双引号中,则编译器将首先查找当前的工作目录或源代码目录(或其他 ...

  3. 再读c++primer plus 003

    1.如果函数返回一个结构而不是一个指向结构的引用,将把整个结构复制到一个临时位置,再将这个拷贝复制给dup.但在返回值为引用时,将直接复制给变量,其效率更高. 2.返回引用时最重要的一点是,应避免返回 ...

  4. 再读c++primer plus 002

    1.读取char值时,与读取其它基本类型一样,cin将忽略空格和换行符,函数cin.get(ch)读取输入的下一个字符(即使是空格),并将其赋给变量ch. 2.指针和const:(1)让指针指向一个常 ...

  5. 再读c++primer plus 006

    使用类: 1.重载限制:(1)重载后的运算符必须至少有一个操作数是用户定义的类型,这将防止用户为标准类型重载运算符 (2)使用运算符时不能违反运算符原来的语法规则,不能修改运算符的优先级 (3)不能创 ...

  6. 再读c++primer plus 001

    1. OOP强调的是在运行阶段(而不是编译阶段)进行决策,运行阶段指的是程序正在运行时,编译阶段指的是编译器将程序组合起来时. 2.变量的值都存储在栈中,而new从被称为堆或自由存储区的内存区域分配内 ...

  7. 再读c++primer plus 005

    对象和类: 1.类和结构的唯一区别是结构的默认访问类型是public,而类为private: 2.其定义位于类声明中的函数都将自动成为内联函数,也可以在类声明外定义成员函数,并使其成为内联函数,为此只 ...

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

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

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

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

随机推荐

  1. 25、ASP.NET MVC入门到精通——Spring.net-业务层仓储

    本系列目录:ASP.NET MVC4入门到精通系列目录汇总 上一节,我们已经把项目框架的雏形搭建好了,那么现在我来开始业务实现,在业务实现的过程当中,不断的来完善我们现有的框架. 1.假设我们来做一个 ...

  2. Idea开发环境中搭建Maven并且使用Maven打包部署程序

    1.配置Maven的环境变量 a.首先我们去maven官网下载Maven程序,解压到安装目录,如图所示: b.配置M2_HOME的环境变量,然后将该变量添加到Path中 备注:必须要有JAVA_HOM ...

  3. 如何合理优化WEB前端 高效提升WEB前端性能

    对前端开发工程师来说,前端性能优化的重要性是不言而喻的,最为大家所知的是YSLOW的23条优化规则,在我的理解中,性能优化不纯粹是指用户访问网站的速度,也包括开发的效率,这里我总结下我理解中的WEB前 ...

  4. ABAP使用OLE2对象创建EXCEL文件

    厌倦了总是下载一模一样的EXCEL文档?没有颜色,边框,有效性验证.... 让我们看看怎样用OLE2对象来创造可爱的EXCEL工作表吧!(效果如下) 首先你需要知道微软EXCEL中的不同部分的名称,每 ...

  5. Android入门开发时注意的两个问题

    android开发中的问题: . 开发应用时要访问网络往往会忘记添加网络权限 <uses-permission android:name="android.permission.INT ...

  6. 【代码笔记】iOS-推荐收听,左右两个tableView

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController ...

  7. C语言关于利用sscanf实现字符串相加减

    #include<stdio.h>#include<string.h>void main(){ int a; int b; char str1[10] = "9999 ...

  8. js中的运算总结(未完待续

    [74由几个1几个5几个10几个20组成] var num = 74; for(one = 0; one <= num; one++){ for(five = 0; five <= num ...

  9. XML语言基础2 DTD

    XML DTD 文档类型定义(DTD)可定义合法的XML文档构建模块.它使用一系列合法的元素来定义文档结构. DTD可被声明于XML文档中,也可以作为一个外部的引用. 内部的DOCTYPE声明 假如D ...

  10. [Erlang 0108] Elixir 入门

    Erlang Resources里面关于Elixir的资料越来越多,加上Joe Armstrong的这篇文章,对Elixir的兴趣也越来越浓厚,投入零散时间学习了一下.零零散散,测试代码写了一些,Ev ...