清华大学出版社《c++程序设计》(第三版)中简单总结的一些知识点
- 函数体没有return则执行至花括号,有return的话,遇到第一个return就立即返回到调用函数
- C++不会自动将精度较高的实参,转化为精度较低的形参,如果确实要用,最好能显式地完成这一转换。
- Call by value传值 int func(int a,int b)
- Call by reference传引用(实参只能是变量,对实参进行了修改)int func(int &a,int &b)
- 引用返回 T& func(int I, T&z) return z 返回的引用是只能是参数列表中的引用
- 形参、实参、默认参(必须是参数列表中尾部的参数)
- 内联参数(inline指示编译器将函数代码复制到程序中所有调用这个函数的地方,减少调用带来的开销,却使代码的规模增大(内联函数有了改动,所有调用它的源函数都必须重新编译))
- 函数重载:允许同名参数表示类似的操作,只要这些函数有不同参数(个数、类型、顺序),这一点与C不同,得益于函数原型的概念。(有函数重载时,千万记得函数声明)
- 存储类别:(变量在声明的时候需要指明变量的存储类别,这里要注意声明和定义的区别,函数或变量在声明时没有分配内存空间的,只有在定义的时候才会。对于变量,同一个文件里,定义和声明没有明显的区别,而在同一个工程,多个文件里,变量和声明才有区别,这里需要注意。相关链接
- 自动储蓄类别:(比如形参)
auto(默认,只在定义它的程序被调用期间存在)、 register(被分配在CPU寄存器中,执行效率高,适合循环次数较多的循环控制变量); - 静态储蓄类别:(一直存在)
extern(总和全局变量联系在一起,在整个文件范围内都有效,最好在头文件里声明, 在同一个工程,在多个文件中变量的声明和定义才有区别。比如说在 first.c 文件中先定义了一个全局变量 int a; 我在 second.c 中要访问这个 a ,这时我们需要在 second.c 这个文件中用 extern 声明一下) static(虽然一直存在,但作用域与与自动变量相同,其他程序不能用它,但再次进入定义它的函数时,又可以继续使用,而且保留了之前的值,全局变量虽然也可以,但其它程序也可以用它)static 初始化问题:反复调用时初始化只有一次但是赋值可以多次 - 标识符 作用域:
- 块作用域(局部作用域):程序块{花括号}、函数体、控制结构语句 “最近嵌套原则”;
- 函数作用域:标号(在goto语句中),在整个函数范围内;
- 函数原型作用域:最小,指函数原型声明时形参的作用范围;
- 文件作用域:在函数和类之外声明的标识符,从声明点开始,到文件结束。
- 递归函数:函数直接或间接调用自己,“递归调用”recursive call。(例:阶乘,汉诺塔)
- 先进后出特征,最先进入的函数调用,最后结束并返回,最后开始执行的函数调用最先结束,并得到调用结果。
- 每次函数的调用,都会被分配储存空间,形参和局部变量都会有不同的储蓄空间。
(例如汉诺塔,本质从大的往小的剥离,要把N-1那一堆看做一个整体,来解决,不要从小的开始) - 预处理指令(不是c++语句,不用封号结尾,由预处理程序执行,在编译之前处理完毕,结果作为编译器的输入)
- #include 尖括号代表在固定目录里中寻找被包括文件,通常标准库里的;使用双引号时,在被编译程序所在目录中寻找被包括文件
- #define定义符号常量或宏,(宏的替换由预处理程序完成,发生在编译之前的预处理阶段,而函数调用发生在目标代码执行时,通过宏扩展产生的代码执行效率高,与内联函数类似。但定义宏比定义函数难度更大)
- #if(常量表达式) #else #endif 条件编译指令,常量表达式为true,才编译他们之间的程序段;#ifdef(宏替换名) #ifndef ,只有定义了宏替换名,才会编译输出
关于返回值:内部类型是不会作为左值用的,返回值为const或者不是const没有影响,因为就算返回值被定义成const,也只是作为返回值的变量不能被修改,返回值在被赋予之前已经变成副本了,它可以被赋给任何的const或非const类型变量,完全不需要加上这个const关键字。但作为自定义类,就不行了,const返回值不能作为左值。
关于引用:对于一般引用,引用的类型必须与其引用的类型一致,非常量引用就不能引用常量对象,而const引用就没事了,他可以随便引,即使所引用的不是常量对象,反正不能通过引用去修改引用对象就行了,甚至: double deval=3.14; const int &a=deval;都是对的,因为实际上编译时为: const int temp=deval; const int &a=temp; 先进行了类型转换,生成一个临时量。 因此引用作为函数参数时,尽量使用常量应用,他能接受更多类型的参数,而const对象、字面值或需要类型转换的对象传递是不能传给给普通的引用形参
|