inline是一个关键字,可以用于定义内联函数。内联函数可以像普通函数一样被调用,但是是在调用点直接展开而不是通过函数调用机制调用。可以大大减少由函数调用带来的开销,从而提高程序的运行效率。

如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。

对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。

因此,事实就是我们利用空间代价换取了时间上的效率。因此,内联函数应该是比较短小的函数,一般只有几行。

阅读全文 »

函数重载在相同的作用域,同样的函数名,不同的形参(不同顺序、类型、个数)
函数隐藏在不同作用域(基类和派生类),同样的函数名,相同或不同的参数,需要实例化相应的对象才能调用相应的成员函数。
重写、覆盖需要用虚函数,是多态的思想,在不同的作用域,同样的函数名,参数值列表相同,返回值类型相同,只有函数体不同。需要区别隐藏和重写。

阅读全文 »

面向对象:对象是指具体的某一个事物,这些事物的抽象就是类,类中包含数据(成员变量)和动作(成员方法)。

面向对象的三大特性:

封装: 将具体的实现过程和数据封装成一个函数,只能通过接口进行访问,降低耦合性。
继承: 子类继承父类的特征和行为,子类有父类的非 private 方法或成员变量,子类可以对父类的方法进行重写,增强了类之间的耦合性,但是当父类中的成员变量、成员函数或者类本身被 final 关键字修饰时,修饰的类不能继承,修饰的成员不能重写或修改。
多态: 多态就是不同继承类的对象,对同一消息做出不同的响应,基类的指针指向或绑定到派生类的对象,使得基类指针呈现不同的表现方式。

阅读全文 »

智能指针是高频考察内容;本文讲述了智能指针的分类,实现原理以及容易出现的问题及其解决方式。

智能指针是为了解决动态内存分配时带来的内存泄漏以及多次释放同一块内存空间而提出的。C++11 中封装在了 <memory> 头文件中。

阅读全文 »

内存泄漏将会导致系统内存中无用的空间越来越多,最终导致内存不足,内存爆炸。所以,有必要防止内存泄漏。本文介绍了两种防止内存泄漏的方法以及内存泄漏检测工具valgrind的实现原理。

阅读全文 »

内存泄漏:由于疏忽或错误导致的程序未能释放已经不再使用的内存。
进一步解释:

  • 并非指内存从物理上消失,而是指程序在运行过程中,由于疏忽或错误而失去了对该内存的控制,从而造成了内存的浪费。

  • 常指堆内存泄漏,因为堆是动态分配的,而且是用户来控制的,如果使用不当,会产生内存泄漏。

  • 使用 malloc、calloc、realloc、new 等分配内存时,使用完后要调用相应的 free 或 delete 释放内存,否则这块内存就会造成内存泄漏。

  • 指针重新赋值

    阅读全文 »

**如何限制类的对象只能在堆上创建?如何限制对象只能在栈上创建?
**说明:C++ 中的类的对象的建立分为两种:静态建立、动态建立。

静态建立: 由编译器为对象在栈空间上分配内存,直接调用类的构造函数创建对象。例如:A a;
动态建立: 使用 new 关键字在堆空间上创建对象,底层首先调用 operator new() 函数,在堆空间上寻找合适的内存并分配;然后,调用类的构造函数创建对象。例如:A *p = new A();

阅读全文 »