学习aaaaaa

本文涵盖了C++的常用方法,如getline和stoi,以及语言特性,如内存对齐和NRV优化。讨论了函数匹配、静态变量的作用域和异常处理机制。还涉及C++的容器,如stack和queue,以及关键字如mutable和auto。多线程中的条件变量和原子操作也被提及。最后,文章介绍了几种设计模式,如适配器和工厂模式,以及数据库操作和Git的使用技巧。
摘要由CSDN通过智能技术生成

C++

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

常用方法

2、getline(cin, string) 接收有空格的输入
3、stoi(str) floor, ceil,promise, future
24、createProcess没调用系统命令解析器
25、异步线程安全fork(); read(); socket(); strcpy()

语言特性

4、::int a 的用法
6、内存对齐:每个元素的位置必须是大小的整数倍,且总大小为占空间最大的元素的整数倍
12、函数默认参数值从最右到左,必须连续
13、NRV (named return value) 优化—局部变量作为返回值时,转换为传入一个res参数的引用,不再调用拷贝构造函数
14、浮点数比较:除了可以表示为2的幂次以及整数数乘的浮点数可以准确表示外,其余的数的值都是近似值。
15、左值引用:int& a = b 相当于取别名,左值相同地址相同
16、右值引用:int&& a = 一个右值; 右值在表达式结束后就无了,这样延长了右值的生存周期
22、重载函数匹配方式: 类型匹配向精度高的匹配
26、静态变量在不同编译单元(.cpp文件)中是相互独立、各自拥有一份的
30、C++的异常匹配规格是根据对象的静态类型进行匹配的(即无多态)
31、#define ALPHA(x,y,z) x##y + z // x = 2, y = 100; z = 1; 2100 + 1
32、局部常量:对于基础数据类型,也就是 const int a = 10 这种,编译器会把它放到符号表中,不分配内存,当对其取地址时,会在栈段分配内存;对于基础数据类型,如果用一个变量初始化局部常量,如果 const int a = b,那么也是会给 a 在栈段分配内存。对于自定数据类型,比如类对象,那么也会在栈段分配内存。
34、enable_if 用作泛型类型检查,自动赋予返回值类型检查等作用。其第一个参数不为真时,通过类型检查,会报编译错误
36、BSS(block started by symbol)

容器

1、erase返回删除元素的下个迭代器
17、const_iterator所指的对象不能变,迭代器可变
19、容器适配器:stack,queue,priority_queue。底层默认使用的是容器deque,vector

关键字

20、mutable(可变的),在lambda使用会生成捕获的参数的副本
21、auto 会屏蔽 顶层const 和引用
28、volatile关键字:关闭寄存器优化,每次都去内存读写;使用场景一写多读:有一个数据,只由一个线程更新,其他线程都来读取。
29、auto一般会忽略掉顶层const(指针本身是个常量),同时底层const会保留下来
顶层const:对象本身是个常量;
底层const:指针所指的对象是个常量、用于声明引用的const都是底层const
27、auto_ptr 若复制,将转移所有权,需注意传参方式; unique_ptr不能复制,只能移动
33、const有只读和常量两个意义,constexpr只有常量的意义。
35、typename的其他作用:使用模板时,有时候分不清A::b是一个类型还是类的成员,必须加上typename指定这是一个类

面向对象

5、virtual继承父类在子类只占一个虚指针的位置,但访问成员需要多一步指针寻址
7、初始化为NULL的类指针,可以安全的调用不涉及类成员变量的类成员函数而不会出错
8、static成员函数没有this指针,不能访问类的非静态成员
9、带参数的基类的构造函数不会被继承
10、如果类的成员有默认构造函数,这个类会默认生成构造函数
11、虚基类的默认构造函数内初始化vptr
18、操作符成员函数重载,左操作符通过this指针,右通过参数传递
23、函数同名,参数不同,virtual可有可无–>隐藏;函数同名,参数相同,无virtual–>隐藏,有virtual–>覆盖
37、子类在拷贝构造时,会调用父类的默认构造函数
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

多线程

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
cv.wait(lock, pred()) 当pred lambda表达式返回值为真时,才解锁线程往下走。其等待时释放lck,陷入睡眠,直到被notify,所以等待时不占用cpu资源
notify_one or all 通知wait的线程,解锁一个或全部
unique_lock<std::mutex> ul_(mutex) 只可移动不可复制
atomic变量多线程是安全的。比如累加到1000,普通变量可能会因为两个线程同时先读,然后再写,导致变量本应+2,实际上只+1。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

设计模式

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
适配器模式:public继承想要实现的类,private继承当作工具使用的类
构造者模式:构造与实现分离,构造的过程更加精细。用build工具类作为目标类的构造参数,形如
Target t = new Target(new Build().setLen().setWidth().build())
工厂模式:有多个子类,将创建子类的条件封装成工厂,在工厂里创建
原型模式:特化拷贝,使以一个原型获得其他对象变得很快
单例模式:只有一个实例,使用于文件、句柄
桥接模式:将抽象和实现分离,使抽象和实现便于复用、修改、扩充
组合模式:将组合抽象,其子类都可以组合,以实现功能
装饰器模式:动态的给对象添加特性,例:用户界面工具箱,装饰器继承可视化组件并用其初始化,装饰器将操作托管给可视化组件,装饰器子类实现特性功能。 pants extend person,override func show, pants.decorate(person); pants.show();
策略模式:当一些类除了某个算法、某种策略不同外,其他都相同,可以将算法抽出一个基类,不同的实现为子类。减少了调用类的if else
模板模式:将算法的过程模板化,子类修改具体的实现,如func() { a(); b();},子类实现a,b
享元模式:在对象需要大量重复的创建时,可以使用之前创建的对象。比如工厂类通过hashmap存创建条件及映射表,有多少条件就会创建多少对象
迭代器模式:迭代器类中定义一个游标变量,每次调用next()后,游标++
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

数据库

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
连接字符串 concat(col_name, str)
截取字符串 substring(col_name, start, len)
postgre 创建函数后,要创建触发器调用这个函数
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

GIT

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
git commit --amend 修改最近一次的提交信息,包含change id
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值