C++拾忆
1、引用
1、建立引用的时候,必须初始化,引用一旦初始化,就和一个对象绑定,不能再修改为其他对象的引用
2、对引用取地址,和对原始对象取地址,是同一个地址
3、不能用做引用的:void、数组
2、内联函数
1、内联函数不能包含复杂的结构控制语句,如switch和while。如果包含了,将被视为普通函数。
2、递归函数不能作为内联函数
3、内联VS宏 宏不检查类型,这个不一定是好还是坏。
3、函数重载
函数名相同,参数不同。(不以返回值区分)
用objdump可以看符号表,objdump -t main.o
以int foo(char,int)为例,
对于C语言来说,不支持重载,所以符号表直接用函数名表示,就是:foo
但对于C++来说,支持重载,所以符号表只用函数名表示是不行的,是:_Z3fooci,_Z3是返回值,参数是ci,c表示char,i表示int,具体咋看:https://blog.csdn.net/wdjjwb/article/details/86233389
所以,如果在C++里要引用C的函数,必须要加extern C,否则声明的是C++的符号类型。
4、函数模板&类模板
1、模板VS宏,模板可以做类型检查,这个不一定是好还是坏。
2、类模板函数的类外实现
template<class T1,class T2>
void A<T1,T2>::foo(T1 t1,T2 t2)
{}
3、类模板分文件编写的问题及解决方案:
问题:链接不到
解决:包含cpp(#include "xxx.cpp") 或者 写.hpp文件
5、类和对象
静态、全局对象会有固定默认值,其他值的默认值是随机的。
类前置声明后,只能使用类的指针和引用,而不能使用类的参数传递。
class A;
class B
{
f(A* a) //正确
f1(A& a) //正确
f2(A a) //错误
}
6、动态内存分配
动态内存分配函数:
1、malloc/free ,是C的函数,所以也就不会构造/析构;是函数调用,不能重载
2、new/delete :是C++运算符,会调用构造/析构函数;是运算符,可以重载
3、new[]/delete[]:数组操作,也要配套使用
内存区域:
1、数据区:全局变量、静态数据、常量
1.1、全局变量:
bss段:存放的是没有初始化或者初始化为0的全局变量
data段:存放初始化为非零的全局对象。
对于一个全局对象,如果初始化为0或者没初始化,可执行文件占用大小很小,如果初始化为非0,可执行文件就会很大。
1.2、静态数据:
全局变量和静态变量被分配到同一块内存中,在以前的 C 语言中,全局变量又分为初始化的和未初始化的(初始化的全局变量和静态变量在一块区域,未初始化的全局变量与静态变量在相邻的另一块区域,同时未被初始化的对象存储区可以通过 void* 来访问和操纵,程序结束后由系统自行释放),在 C++ 里面没有这个区分了,他们共同占用同一块内存区。
1.3、常量
rodata常量数据区
rodata存放常量数据
有些立即数直接和指令编码在一起,放在text中
字符串常量,编译器会去掉重复的字符串,保证只有一个副本
所以, char* s1 = "abcde"; char* s2 = "abcde"; //s1和s2的地址是一样的。
但只有指针直接指向字符串的时候才会指向常量区的字符串,如果拷贝过,或者数组就不行
但是数组不行 char a[] = "abcde"; 是把数据区的字符串拷贝到栈区的数组里了,a是数组首地址。
2、代码区:所有类的成员函数和非成员函数代码
3、栈区:为运行函数而分配的局部变量、函数参数、返回数据、返回地址等
4、堆区:动态内存分配区
7、拷贝构造函数
class A{ A(const & A);//拷贝构造函数 }
如果没声明,会默认提供一个,组个拷贝每个非static成员。
在传参和返回值时会隐式调用。
禁止拷贝构造函数的方法:private
8、const
const int *p; // 指的是 *p 不能修改
int* const p; // 指的是p不能修改
推荐传递const引用,而不是传递对象,效率更高。
9、友元函数和友元类
友元关系不对称、不传递
A声明了B是友元,那么B久可以访问A的private和protect成员,B可以是方法或者类。
10、Valgrind内存检测/性能分析工具
11、重载运算符
不能重载的运算符: :: .* . ?:
可以使用友元函数或成员函数实现运算符重载,友元函数需要多一个参数,不需要加类作用域。
必须作为成员函数重载的运算符: = () [] ->
前增量重载 A& operator++()
后增量重载 A operator++(int)
12、多态
需要多态的函数需要声明为virtual
析构函数要申明为virtual
Java的所有方法都是virtual的
13、智能指针
SmartPtr是一个模板类
跟shared_ptr不一样。
14、设计模式
用策略模式替代菱形或其他复杂的继承
15、STL 标准模板库
字符串: stirng
容器:vector deque stack queue list map set
算法:
<algorithm> 包括 :
比较
查找find find_if adjacent_find(查相邻重复的元素) binary_search(二分查找制定元素是否存在,返回bool,速度快,要求有序)
统计count count_if
搬运transform
遍历for_each
复制 copy
替换 replace replace_if swap(互换)
排序 sort random_shuffle(洗牌,sort的逆操作)
合并 merge
反转 reverse
集合函数:set_intersection 求交集,set_union 求并集,set_difference 求差集
等等
<numeric> 包括 几个在序列上进行简单数学运算的模板函数
accuulate 求和
fill 将指定区间的元素填充成指定值
<functional> 定义了一些模板类,用以申明函数对象
15.1、deque
行为是一个双向数组
原理是一个多段数组
VS vector 优点:双向,插入块;缺点:访问慢
15.2、set vs multiset
multiset可以插入重复的值。
insert的返回结果是个pair,第一个是插入的迭代器位置,第二个是是否成功,如果是set插入重复的值,实际是插入失败的。
16、仿函数
重载了()操作符的函数
16.1、谓词
返回值为bool的仿函数
16.2、算数仿函数
操作的目的是计算的
16.3、关系仿函数
操作的目的是比较的
16.4、逻辑仿函数
操作的目的是逻辑操作的
17、多线程编程
18、数组内存大小
int a[] = {1,2,3,4,5,6};
sizeof(a)= 6*4; //数组总大小
sizeof(a[0])=4; //int的大小
int* p = &a;
sizeof(p)=4或8; //指针的大小
&a 和 a 都是指数组的首地址
但由于数据类型不一样,&a是数组,a是数组首元素。 &a + 1 为偏移整个数组,因为&a表示的是数组,+1指偏移数组的大小; a+1 为偏移一个元素
C++拾忆的更多相关文章
- .Net拾忆:从List去除重复-拾忆集合
方法1: private static List<int> DistinctList(List<int> list) {//去除重复 HashSet<int> ha ...
- Libero 使用拾忆
使用Libero软件进行管脚分配的时候可以使用脚本语言,详细的使用说明见des_constraints_ug.pdf(在Libero安装目录下寻找) 如: set_io srame_oe -REGIS ...
- jquery实现的网页选项卡(拾忆)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python拾忆--多线程的socket服务器
阳光明媚的午后,想想最近要开始从写Java到写Python了,就随手打开电脑来体验一下Python与Java之间的不同吧~ 记得我还在上大二的时候,那个时候才开始学Java,最感兴趣的就是Java书最 ...
- SQL SERVER 高级编程 - 自定义函数 拾忆
每个人都很忙,但是花10分钟复习下,总结下基础东西还是很有益处的. 背景: 总结一句,使用简便,还能递归,是的SQL更简洁,相对比一大堆的关联语句,而且关联一大堆还不一定实现特定功能.而且共用部分可以 ...
- spring mvc DispatcherServlet详解之拾忆工具类utils
DispatcherServlet的静态初始化 /** * Name of the class path resource (relative to the DispatcherServlet cla ...
- #ifdef,#else,#endif,#if 拾忆
预处理就是在进行编译的第一遍词法扫描和语法分析之前所作的工作.说白了,就是对源文件进行编译前,先对预处理部分进行处理,然后对处理后的代码进行编译.这样做的好处是,经过处理后的代码,将会变的很精短. ...
- Js拾忆
instanceof运算符:他是判断一个构造函数的prototype是否在对象的原型链上查找到 var a = new Array(); console.log(a instanceof Array) ...
- .NET拾忆:反射的本质——元数据
反射主要使用的命名空间: System.Reflection System.Type System.Reflection.Assembly 本质:元数据 反射的本质其实是使用元数据:元数据其实就是程序 ...
- .NET拾忆:FormData文件上传
方法1.FormData简单实现 后端: using System; using System.Collections.Generic; using System.IO; using System.L ...
随机推荐
- 《挑战30天C++入门极限》理解C++面向对象程序设计中的抽象理论
理解C++面向对象程序设计中的抽象理论 很多书在一开始就开始学习josephus问题,为了让大家前面学起来较为容易我把前面涉及到此问题的地方都故意去掉了,现在我们已经学习过了结构体和类,所以放 ...
- 信竞四定律orz
正常代码不写#define @zdx 平时刷题不写freopen @liuziwen 循环内部不写return 0 @asdfo123 主程序内不写char array @asdfo123 输出时间: ...
- localstorage和cookie的设置方法和获取方法
1.设置localStorage window.localStorage.setItem(vm.mobileSelf,JSON.stringify(contactInfo)); vm.mobileSe ...
- Linux 文件查询
查看文件类型:file 如果你想要知道某个文件的基本数据,例如是属于ASCII或者是data文件,或者是binary,且其中有没有使用到动态函数库等等的信息,可以用file查看 which (寻找“执 ...
- 【Vue.js游戏机实战】- Vue.js实现大转盘抽奖总结
大家好!先上图看看本次案例的整体效果. 实现思路: Vue component实现大转盘组件,可以嵌套到任意要使用的页面. css3 transform控制大转盘抽奖过程的动画效果. 抽奖组件内使用钩 ...
- Thingsboard 重新启动docker-compose容器基础数据存在的问题
在重启了thingsboard的容器后,想再次重新启动容器,发现已经出现了错误 查看posttres中,持久化的地址是tb-node/postgres中 再查看相应的文件夹 删除以上log和postg ...
- 第十二章 Python文件操作【转】
12.1 open() open()函数作用是打开文件,返回一个文件对象. 用法格式:open(name[, mode[, buffering[,encoding]]]) -> file obj ...
- ThinkPHP5使用phpspreadsheet导入导出Excel
引用类: use PhpOffice\PhpSpreadsheet\IOFactory; use PhpOffice\PhpSpreadsheet\Cell\Coordinate; use Php ...
- super与this的用法
1 super和this都是调用其他的构造方法 super放在构造方法的第一条语句,调用父类的某种构造方法,如果没有super语句,会默认调用父类中无参的构造方法,如果父类构造方法指明而且都有参数,子 ...
- win10: windows+E 改回打开我的电脑
之前习惯使用windows+E来打开我的电脑,用了win10之后按windows+E打开的却是“快速访问”文件夹,很不习惯,可用下列办法改回: 1.打开“查看”选项卡,选择”选项“按钮. 2.在“常规 ...