c++:如何去学好c++?那么下面这几个问题和关键字必须要清楚地了解一下
【1】带默认参数的函数和不带默认参数的函数有何区别?
提到这个问题,你肯定会说:带默认值的形参必须要在参数的右边,因为函数是自左向右依次赋值,带默认值的函数调用如果调用时没有传入实参,形参就会用默认值。。。
但是你有没有想过不带默认值的函数调用时会有实参开辟栈,那么带默认值的函数调用既然不用传入实参,会不会减小栈的开销呢?为什么?
其实带默认值的函数调用时如果没有没有传入实参,形参的默认值会有push 压栈形参,并不会减少汇编指令和栈的开销,所以并不能提高函数的调用效率。
【2】inline函数
提到这个问题我们能罗列出一大堆:
1.inline函数就是在普通函数之前加了一个inline关键字,普通函数的调用有栈的开销,内联函数没有,提高了调用效率
2.inline函数在编译期间在调用点展开代码,无函数符号的生成,不能进行链接,因此内联函数只在本文件可用,一般写在头文件中,被源文件包含;
3内联函数必须在调用点之前,只在本文作用域可见;
4.内联函数只在release版本生效,在debug版本不起作用;
5.内联函数只是对编译器的建议,是否按内联函数处理就要看编译器的决定了
【3】static
static可以修饰变量,可以修饰函数,可以修饰类的成员函数
static修饰的变量分配在静态存储区,在函数运行结束后销毁,static不能接受this指针,所以static修饰的函数不属于类,static修饰的函数页不能访问类中的函数和变量
【4】const
c:常变量
编译阶段有没有做左值,若常变量没有做左值 其他处理和变量一样
c++ :常量1.一定要初始化;2.不允许做左值;3.不允许间接修改访问内存块;(杜绝间接访问的风险)
编译阶段 把const常量使用的地方换成常量初始化的值 ;c++编译器常常不为普通的const常亮分配存储空间,而是将它们保存在符号表中,
使得他们成为预编译期的常亮,没有存储和读内存的操作,使它的效率非常高;
const修饰对象函数时:常对象调用常方法
因为this指针是 test * const
【5】new和delete
new/delete
int *p1 = new int;
new的重定位:int a; char *p2=new (&p) char('a');
malloc/free
int *p = (int *)malloc(sizeof(int));
1】new是关键字,malloc是函数
2】new自由存储区(重定位),malloc在堆上
3】new
operator new (开辟内存)
constructor(初始化)
malloc(申请内存)
4】operator new 可以重载,malloc不可以重载
5】new可以调用malloc,malloc不可以调用new(接受版本,向前接受)
6】内存开辟失败
new:抛出异常,
malloc:返回空
7】new可以开辟常量 const int *p=const new int(10);
int *p=new int[10];
delete p;//true
class test *p=new test [10];
delete p;//error(需要释放资源和内存,资源要释放十次)
new的底层实现会在linux中提到(内存管理【很重要】)