一、new/delete 与 malloc/free
1.new/delete是C++运算符,因而可以在编译期做额外的工作;malloc/free是C语言标准库函数。都用于内存申请和释放
2.new/delete可以自动执行构造函数和析构函数,而malloc/free不行,因为new/delete是面向对象的动态内存管理
3.malloc分配内存需要指定大小和返回类型转换,而new会自动计算需要分配的内存、自动进行类型转换
二、struct和class
struct能包含成员函数吗? 能!
struct能继承吗? 能!!
struct能实现多态吗? 能!!!
1.默认的继承访问权限不同,基类为struct的是public继承,基类为class的是private继承
2.成员的默认访问权限不同,struct是public,class是private
3.“class”这个关键字还用于定义模板参数,就像“typename”。
三、inline
inline是内联函数关键字,用来告诉编译器这个函数是内联函数,在编译期间内对这个函数直接展开,而不是在运行时进行调用,减少了函数调用的成本
1.关键字必须与函数定义放在一起才有效,放在声明前没有任何作用
2.定义在类内的成员函数自动成为内联函数
以下情况不宜使用内联:
(1)如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。类的构造函数和析构函数容易让人误解成使用内联更有效。要当心构造函数和析构函数可能会隐藏一些行为,如“偷偷地”执行了基类或成员对象的构造函数和析构函数。所以不要随便地将构造函数和析构函数的定义体放在类声明中。一个好的编译器将会根据函数的定义体,自动地取消不值得的内联(这进一步说明了 inline 不应该出现在函数的声明中)。
虚函数为什么不能成为内联函数?内联函数需要在编译期内就将函数展开,而虚函数需要在运行时才能知道所要调用的函数。
inline和#difine区别?
1.宏是由预处理器对宏进行替代,而内联函数是通过编译器控制来实现的。
2.内联函数有参数检查,而difine没有
3.内联函数可作为成员函数,而difine不行