一、创建引用的时候,必须初始化,引用一旦初始化,就和一个对象绑定,不能再修改成其余对象的引用算法
二、对引用取地址,和对原始对象取地址,是同一个地址编程
三、不能用作引用的:void、数组设计模式
一、内联函数不能包含复杂的结构控制语句,如switch和while。若是包含了,将被视为普通函数。数组
二、递归函数不能做为内联函数多线程
三、内联VS宏 宏不检查类型,这个不必定是好仍是坏。dom
函数名相同,参数不一样。(不以返回值区分)函数
用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++的符号类型。
一、模板VS宏,模板能够作类型检查,这个不必定是好仍是坏。
二、类模板函数的类外实现
template<class T1,class T2>
void A<T1,T2>::foo(T1 t1,T2 t2)
{}
三、类模板分文件编写的问题及解决方案:
问题:连接不到
解决:包含cpp(#include "xxx.cpp") 或者 写.hpp文件
静态、全局对象会有固定默认值,其余值的默认值是随机的。
类前置声明后,只能使用类的指针和引用,而不能使用类的参数传递。
class A;
class B
{
f(A* a) //正确
f1(A& a) //正确
f2(A a) //错误
}
动态内存分配函数:
一、malloc/free ,是C的函数,因此也就不会构造/析构;是函数调用,不能重载
二、new/delete :是C++运算符,会调用构造/析构函数;是运算符,能够重载
三、new[]/delete[]:数组操做,也要配套使用
内存区域:
一、数据区:全局变量、静态数据、常量
1.一、全局变量:
bss段:存放的是没有初始化或者初始化为0的全局变量
data段:存放初始化为非零的全局对象。
对于一个全局对象,若是初始化为0或者没初始化,可执行文件占用大小很小,若是初始化为非0,可执行文件就会很大。
1.二、静态数据:
全局变量和静态变量被分配到同一块内存中,在之前的 C 语言中,全局变量又分为初始化的和未初始化的(初始化的全局变量和静态变量在一块区域,未初始化的全局变量与静态变量在相邻的另外一块区域,同时未被初始化的对象存储区能够经过 void* 来访问和操纵,程序结束后由系统自行释放),在 C++ 里面没有这个区分了,他们共同占用同一块内存区。
1.三、常量
rodata常量数据区
rodata存放常量数据
有些当即数直接和指令编码在一块儿,放在text中
字符串常量,编译器会去掉重复的字符串,保证只有一个副本
因此, char* s1 = "abcde"; char* s2 = "abcde"; //s1和s2的地址是同样的。
但只有指针直接指向字符串的时候才会指向常量区的字符串,若是拷贝过,或者数组就不行
可是数组不行 char a[] = "abcde"; 是把数据区的字符串拷贝到栈区的数组里了,a是数组首地址。
二、代码区:全部类的成员函数和非成员函数代码
三、栈区:为运行函数而分配的局部变量、函数参数、返回数据、返回地址等
四、堆区:动态内存分配区
class A{ A(const & A);//拷贝构造函数 }
若是没声明,会默认提供一个,组个拷贝每一个非static成员。
在传参和返回值时会隐式调用。
禁止拷贝构造函数的方法:private
const int *p; // 指的是 *p 不能修改
int* const p; // 指的是p不能修改
推荐传递const引用,而不是传递对象,效率更高。
友元关系不对称、不传递
A声明了B是友元,那么B久能够访问A的private和protect成员,B能够是方法或者类。
不能重载的运算符: :: .* . ?:
可使用友元函数或成员函数实现运算符重载,友元函数须要多一个参数,不须要加类做用域。
必须做为成员函数重载的运算符: = () [] ->
前增量重载 A& operator++()
后增量重载 A operator++(int)
须要多态的函数须要声明为virtual
析构函数要申明为virtual
Java的全部方法都是virtual的
SmartPtr是一个模板类
跟shared_ptr不同。
用策略模式替代菱形或其余复杂的继承
字符串: 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> 定义了一些模板类,用以申明函数对象
行为是一个双向数组
原理是一个多段数组
VS vector 优势:双向,插入块;缺点:访问慢
multiset能够插入重复的值。
insert的返回结果是个pair,第一个是插入的迭代器位置,第二个是是否成功,若是是set插入重复的值,实际是插入失败的。
重载了()操做符的函数
16.一、谓词
返回值为bool的仿函数
16.二、算数仿函数
操做的目的是计算的
16.三、关系仿函数
操做的目的是比较的
16.四、逻辑仿函数
操做的目的是逻辑操做的
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 为偏移一个元素