c++ primer 5 笔记

endl;//会刷新设备缓冲区

2.1.2类型转换
wchar_t//确保可以存放机器最大字符集的任意一个字符
char16_t char32_t//Unicode字符集服务
unsigned char c = -1;//255 超出显示范围 初始值对无符号类型表示总数取模后的余数
signed char c = 256;//超出显示范围 c的值未定义

避免混用有符号和无符号类型
int a = 1;
unsigned b = -1;
cout << a * b; // 4294967295 不是 -1 隐式类型转换

//参考 https://www.cnblogs.com/LCCRNblog/p/5225065.html
有符号数与无符号数的相互转换
无符号整数和有符号整数之间进行强制类型转换时,位模式不改变。
有符号数转换为无符号数时,负数转换为大的正数,相当于在原值上加上2的n次方,而正数保持不变。
无符号数转换为有符号数时,对于小的数将保持原值,对于大的数将转换为负数,相当于原值减去2的n次方。
当表达式中存在有符号数和无符号数类型时,所有的操作都自动转换为无符号类型。可见无符号数的运算优先级高于有符号数。
unsigned int a = 20;
signed int b = -130;
 运算一下结果是 b>a 

指向指针的引用
int i = 42;
int *p = i;
int *&r = p;

常量引用知识对操作做出了限制,引用的对象如果是变量依然可以通过其他方式改变
int i = 42;
int &r1 = i;
const int &r2 = i;
r1 = 0;//可以
r2 = 0;//错误

i++ ++i
vector是数组型数据结构 push_back后会重新分配内存 迭代器会失效
当一个对象被用作右值的时候 用的是对象的值(内容) 用做左值的时候 用的是对象的身份(内存的位置)
i++是先用临时对象保存原来的对象,然后对原对象自增,再返回临时对象,不能作为左值;++i是直接对于原对象进行自增,然后返回原对象的引用,可以作为左值。
由于要生成临时对象,i++需要调用两次拷贝构造函数与析构函数(将原对象赋给临时对象一次,临时对象以值传递方式返回一次);
++i由于不用生成临时变量,且以引用方式返回,故没有构造与析构的开销,效率更高。
所以在使用类等自定义类型的时候,应尽量使用++i。

#include <iostream>
using namespace std;
size_t count_calls();
int main()
{
	for(int i = 0;i != 10;++i) {
		cout << count_calls() << endl;
	}
    return 0;
}

size_t count_calls() {
	static size_t ctr = 0;//只初始化一次,不会重新初始化为0
	return ++ctr;
}
0
1
2
3
4
5
6
7
8
9
10

智能指针陷阱
智能指针可以提供对动态分配的内存安全而又方便的管理,但这是建立在正确使用的前提下。为了正确使用智能指针,我们必须坚持一些基本面规范:
·不使用相同的内置指针初始化(或reset)多个智能指针
·不 delete get() 返回的指针。
·不实用get()返回的指针初始化或rest另一个智能指针。
·如果你使用get()返回的指针,记住当最后一个对应的智能指针销毁后,你的指针就变为无效了。
·如果你使用智能指针管理的资源不是new分配的内存,记住传递给它一个删除器。
posted @ 2023-12-31 23:31  奔付山河  阅读(9)  评论(0编辑  收藏  举报