C++ primer 5 笔记2 chapter 2 变量和基本类型(2.1~2.3)

第二章是变量和基本类型

2.1 基本内置类型

2.1.1 算术类型

a、C++相比C 多了几个算术类型 wchar_t, char16_t, char32_t
其中, wchar_t 是宽字符, char16_t, char32_t 是unicode字符, 问题来了, 宽字符和unicode有什么区别呢?
打开百度一下,你就不知道宽字符 ,我们可以知道
用多个字节来代表的字符称之为宽字符,而Unicode只是宽字符编码的一种实现,宽字符并不一定是Unicode.

b、C11中定义了一个新的类型 long long 占8个字节

c、浮点型可以表示单精度, 双精度, 扩展双精度, 一般float, double类型分别有 7, 16个有效位。
也就可以理解 为什么float类型与 0 比较的时候要用 fabs(x) < 1e-6了。

d.一般要求知道数据不可能为负时候, 可以选用无符号类型 unsigned

e.算术运算尽量不要使用char 和 bool, 不同的机子上 char 需要明确unsigned char 和 signed char

f.执行浮点数运算的时候选用double, 因为float通常精度不够,而且计算的代价相差不大


2.1.2 类型转换

a. 当给一个数据类型赋值, 超过他的数据范围的时候, 出现的结果是未定义的

b.当算术表达式中同时存在unsigned 和 signed 类型时候, signed 会被转化成 unsigned, 这个需要特别注意

c.无符号数不会小于0, 写到for循环中去,容易出现死循环的情况 <-_->!!
这个自己好像还真写过, 在MFC中用UINT类型的时候。。。

d.UINT_max = 4294967295
singed int 被解释成unsigned int 类型的时候 可以这样运算:

unsigned_int=232+1+signed_int,whensigned_int<0


2.1.3 字面值常量

a. 默认情况下, 字面值常量是取能容纳该数据 的最小的数据类型
对于负数而言, 符号不算在字面值之内
浮点型字面值为 double

b. 如果两个字符串字面值位置相邻且仅有 空格, 缩进, 换行符分隔, 则实际上仍是一个整体。

std::cout<<"a really, really long string literal"
        "that spans two lines"<<std::endl;

c. 泛化的转义序列, \x 表16进制数据, \接数据 表8进制(最多三位)

d. \a, \7 响铃


2.2 变量

2.2.1 变量定义

a. 对C++而言, “变量” 和 “对象” 一般可以互换使用

b. 对象: 一块能够存储数据并具有某种类型的内存空间

c.在同一条定义语句中, 可以用先定义的变量值 去初始化后面的变量

d.初始化和赋值的关系
初始化不是赋值, 初始化是创建一个变量并为他赋一个初始值, 赋值是指将对象当前值擦除,用一个新的值来取代

e. 花括号初始化时, 如果初始值存在丢失的风险, 编译器将会报错, 而其他的方式会进行隐式转化

f. 函数体外的内置类型会被初始化为0, 函数体中的不会
而类对象有其自身决定


2.2.2 变量声明和定义的关系

a. 函数体内, 试图初始化一个有extern标记的变量会出错
这里写图片描述
放到函数体外的时候,只是一个warning

b。

    extern int i; // 声明
    int i;        // 定义
    extern int i = 4// 定义

c. C++ 中int j; 直接就是定义
这里写图片描述
这段代码是用gcc编译的, 可以通过, 说明 C 中全局变量int i;仅仅只是一个声明,而不是定义。而同样的代码在 g++中却无法通过, 因为已经多重定义, 需要显示使用extern

d. C 中变量定义一定要在区域的开始处, C++不需要

e. C++可以通过域操作符,访问被覆盖的父级对象


2.3 复合对象

2.3.1 引用

a. 引用即别名
引用并非对象, 他只是为一个已经存在的对象起的另外一个名字

b. 引用只能绑定在对象上, 不能与字面值或者表达式的计算结果绑定在一起


2.3.2 指针

a. 与引用不同, 指针本身就是一个对象, 允许对指针的赋值和拷贝, 而在指针的生命周期内也可以先后指向多个不同对象, 并且无需在定义的时候赋值

b. 对指针的解引用得到所指的对象, 因而要求此时的指针一定是有效的

c. nullptr 用来初始化指针, 他是一种特殊类型的字面值
NULL 也可以用来初始化指针, 但他是定义在 cstdlib 中的预处理变量

d. 引用是专一的, 指针是花心的

e. 赋值永远改变的是等号左侧的对象

f. void* 指针, 只能存放内存地址, 不能访问内存空间


2.3.3 理解复合类型的声明

a. 引用本身不是一个对象, 因此不能定义指向引用的指针。但是指针是对象, 因而可以有 对指针的引用

b. 理解比较复杂的指针或者引用的声明语句的时候, 从右向左阅读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值