-
浅拷贝:只是对指针的拷贝,拷贝后两个指针指向同一个内存空间,这样在对象块结束,调用函数析构的时,会造成同一份资源析构2次,即delete同一块内存2次,造成程序崩溃。浅拷贝使得两个obj指向同一块内存,任何一个obj发生改变都会直接影响另一方,释放内存的时候会造成内存泄漏。
深拷贝:不但对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针,深拷贝采用了在堆内存中申请新的空间来存储数据,这样每个可以避免指针悬挂。 -
C++中表示空指针用nullptr,而不是null,形如 Cache* block_cache = nullptr
-
内联函数(inline):对于只有几条语句的小函数来说,与函数的调用、返回有关的准备和收尾工作的代码往往比函数体本身的代码要大得多。因此,对于这类简单的、使用频繁的小函数,将之声明为内联函数可提高运行效率。
-
std::endl只有换行的作用
-
const char* 变量名 是一个一个指向字符常量的指针,该指针是无法通过指针修改指向的内容的,打印其指向内容时可以先把指向的内容存入一个字符串变量,然后通过for循环打印字符串,进而打印指针指向的内容
-
Nil与Null的区别
Nil:表示无值,任dao何变量在没有被zhi赋值之前的值都为daonil。用于区别其他任何值。针对对象,而空对象不是说不占用空间,相当于一个“洗白”,回到初始状态。
Null:是在计算内中具有保留的值。用于指示指针不引用有效对象。针对指针,对对象指针和非对象指针都有效,Null不会占用空间。 -
编写的时候对于一些要判断的变量或者逻辑可以用assert断言,随时的break掉程序,assert中判断的内容为true,则程序继续运行,为false则中断。
-
条件编译:对其中一部分内容只在满足一定条件才进行编译,对于 #if 0 #endif这种情况
#if 0
code;
#endif
(1)code中定义的是一些调试版本的代码,此时code完全被编译器忽略。如果想让code生效,只需把#if 0改成#if 1
(2)#if 0还有一个重要的用途就是用来当成注释,如果你想要注释的程序很长,这个时候#if 0是最好的,保证不会犯错误。(但是林锐的书上说千万不要把#if 0 来当作块注释使用) #if 1可以让其间的变量成为局部变量。
(3)这个结构表示你先前写好的code,现在用不上了,又不想删除,就用这个方法,比注释方便。 -
数据结构中的堆栈与内存中不同,在内存中栈是系统自动分配的空间,生命周期结束后会被自动收回,而堆是程序员人为去申请的,像malloc和numa_alloc_onnode。
举例:
栈:使用栈就像我们去饭馆里吃饭,只管点菜(发出申请)、付钱、吃(使用),吃饱了就走,不必理会切菜,洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处就是快捷,但是自由度小。
堆:使用堆就像是自己动手做喜欢的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大 -
一个进程中的所有线程是共享该进程的地址空间(堆),但它们有各自独立的(/私有的)栈(stack)。
-
explicit用来防止由构造函数定义的隐式转换
-
虚函数在基类中是有定义的,即便定义是空,所以子类中可以重写也可以不写基类中的函数!
引入原因:为了方便使用多态特性,我们常常需要在基类中定义虚函数。
纯虚函数在基类中是没有定义的,必须在子类中加以实现,很像java中的接口函数!
引入原因:
1、同“虚函数”;
2、在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。
class A{
protected:void foo();//普通类函数
virtual void foo1();//虚函数
virtual void foo2() = 0;//纯虚函数
}
13.注意打印指针时不要再对指针用取地址符,%p对应的就是指针变量所指向的地址值,再加取地址符就是打印开辟指针变量的内存地址
C++总结
最新推荐文章于 2023-07-27 21:02:56 发布