#ifdef __cplusplus
extern "c"
{
#endif
int sum(int,int); //在C语言下只会根据函数名生成符号,在C++下会根据函数名+参数列表生成符号
#ifdef __cplusplus
}
#endif
C和C++的内存分布没有区别,usr space (reserve、.text、.rodata、.bss、heap stack 命令行参数和环境变量)+kernal space(ZONE_DMA 、ZONE_NORAMAL、ZONE_HIGHMEM)
class Test
{
public:
Test(const Test t);
}
Test t1;
Test t2(t1);
//实际上是 t2.Test(t1)->先用t1拷贝构造形参t const Test t(t1)->t.Test(t1).......无限循环
const int a = 10;
int *p = (int*)&a;
*p = 20;
cout<<"a = "<<a<<"*p= "<<*p<<endl;
//结果是 a = 10 *p = 20
int b =3;
const int a = b; //此时a叫做常变量
int *p = (int*)&a;
*p = 20;
cout<<"a = "<<a<<"*p= "<<*p<<endl;
//结果是 a = 20 *p = 20
const还可以定义常成员方法 -this指针从Test* this =》 const Test * this普通对象和常对象就都可以调用了 const和static的区别 从面向过程来说: const只能修饰全局变量、局部变量、形参变量 static可以修饰全局变量、局部变量 const:不能修饰函数 static 可以修饰函数,改变符号的作用域,改成只本文件可见 从面向对象来说: const修饰的叫常方法(普通对象和常对象就都可以调用,但是只能进行读操作,不能进行写操作)/常成员变量(不能别修改的变量,必须在构造函数初始化列表中定义)都依赖于对象 static修饰的叫静态方法(本质是this指针没有了,不依赖于对象,通过类作用域访问)/静态成员变量
扩容:第一维数组按照2倍方式进行扩容2-4-8… 扩容以后会把原来的第二维的数组,从新一维数组的oldsize/2 开始存放,也就是从中间开始存放,为了首尾插入方便。 deque的内存利用率比较好,刚开始就有一段内存可以提供使用
try
{
可能会抛出的异常代码
}
catch(const string& err)
{
捕获相应异常类型对象,进行处理,完成后,继续向下运行
}
异常的栈展开: 在当前函数栈帧上没有找到相应的catch块处理,就会把异常抛给调用方函数,调用方依然安装这样的逻辑来处理,如果捕获相应异常类型对象,则进行处理,完成后,继续向下。如果还没有找到,依然会抛给调用方,反复判断处理,直到到达main主函数,再抛给系统,直接终止进程。 可以把代码中所有的可能发生的异常抛出到同一的地方进行处理,不会出现问题就随时exit(0);
int a =10;
int* p = &a;
int &q = a;
//前面两句在汇编指令上完全一致的 把a的内存拿出来放在寄存器,再把寄存器的值放在底层的4字节的指针变量
lea eax,[a] mov dword ptr[ebp-8],eax
lea eax,[a] mov dword ptr[ebp-0Ch],eax
*p = 20;
q = 20;
//指令也一样,先从底层4字节的指针里面拿出来引用内存的地址,再把20写到4字节内存的地址里面
mov eax,dword ptr[ebp -8] mov dword ptr[eax],14H
mov eax,dword ptr[ebp -0Ch] mov dword ptr[eax],14H
定义对象的时候使用强智能指针shared_ptr 引用对象的时候用弱智能指针weak_ptr 当通过weak_ptr访问对象成员时,需要先调用weak_ptr的lock提升方法,把weak_ptr提升成shared_ptr智能指针,再进行对象成员的调用