随笔分类 - C++
摘要:一、基本认识 在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。栈由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等堆由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。自由存储区由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的全局/静态存储区全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有.
阅读全文
摘要:一、C++对象内存模型认知模式 二、C++类数据成员内存模型 <1>无继承情况 <2>单继承与多重继承的情况 <3>虚继承 观点: <a>非静态数据成员在类实例内存中在内存中连续存储; <b>静态数据成员不占类实例内存; <c>一个子类的内存模型可以看成就是父类的各数据成员与自己新添加的数据成员的总和; <d>虚拟继承中,关于对象的数据成员内存布局问题有多种策略,自己注意测试;三、C++类函数成员的内存模型 相关概念:C++的指针类型 指针类型中包含了一个类似于sizeof的信息,或者其他的辅助信息,个size
阅读全文
摘要:前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。1.基本认识 虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的,简称为V-Table,在这个表中,主是要一个类的虚函数的地址表。C++的编译器应该是保证虚函数表的指针存在于对象实例中最..
阅读全文
摘要:1.当编译器看到模板定义的时候,它不立即产生代码。 只有在看到用到模板时 ,如调用了函数模板或定义了类模板的对象的时候,编译器才产生特定类型的模板实例 。2.普通代码和模板代码的区别: 一般而言,当调用函数的时候,编译器只需要看到函数的声明。类似地,定义类类型的对象时,类定义必须可用,但成员函数的定义不是必须存在的。因此,应该将类定义和函数声明放在头文件中,而普通函数和类成员函数的定义放在源文件中。 模板则不同:要进行实例化,编译器必须能够访问定义模板的源代码。 当调用函数模板或类模板的成员函数的时候,编译器需要函数定义,需要哪些通常放在源文件中的代码。3.标准C++为编译模板代码定义了两..
阅读全文
摘要:大三都结束了,以前一直是在网上搜别人写的blog来学习学习东西,自己从来没有写过,今天起就开始过把瘾,写写blog... 这几天在看Effective C++(2nd),看得还差不多了,有一种欣喜也有一种震惊吧,原来自己以前学的C++那么肤浅啊...废话不多讲,学习体会如下: 1.C++类中重载操作符的了解: 1.1重载为成员函数还是友元函数,有讲究; 1.2为什么流提取操作符和流插入操作符要声明为类的友元函数; 1.3重载前置++和后置++的方法; 1.4重载函数返回值和返回引用的区别; 1.5单目运算符和双目运算符的重载; 2.C++ class的基...
阅读全文