“重载”和“重写的区别”
重载
指函数名相同,但是它的参数表列个数或顺序,类型不同。但是不能靠返回类型来判断。
- 相同的范围(在同一个作用域中) ;
- 函数名字相同;
- 参数不同;
- virtual 关键字可有可无。
- 返回值可以不同;
重写(也称为覆盖 override)
是指派生类重新定义基类的虚函数,特征是:
- 不在同一个作用域(分别位于派生类与基类) ;
- 函数名字相同;
- 参数相同;
- 基类函数必须有 virtual 关键字,不能有 static 。
- 返回值相同(或是协变),否则报错;
- 重写函数的访问修饰符可以不同。尽管 virtual 是 private 的,派生类中重写改写为 public,protected 也是可以的
注意:若已包含标准库头文件及相关命名空间,则系统不允许用户重写标准库函数
#include 和 #include”filename.h”的区别
#include
,再找其他地方。用于系统文件较快。
#include”filename.h”系统检索头文件时先从程序所处目录开始查找。
用于自定义文件较快。
参数传递的问题
1 | int f(int a, int b, int c) |
考虑如下两个问题:
- printf的返回值
- 参数入栈的顺序
printf的返回值
1 | //函数原型,因此其返回值为int型数据 |
函数实参传递的顺序
- 在x86架构(Linux或Unix系统)上,函数的参数是通过栈传递的。因此参数从右往左入栈顺序是:printf(“c”),printf(“b”),printf(“a”)。依次计算出结果:cba
- 在x86_64架构(Linux或Unix系统)上,函数的前6个参数是通过寄存器传递的,超出6个的部分(如第7个参数,第8个参数等等)通过栈传递。因此参数进寄存器顺序是:printf(“a”),printf(“b”),printf(“c”)。依次计算出结果:abc
补充:
- 模板的使用实际上是将类模板实例化成一个类。
- 两个相同作用域内的函数 如果除了返回值类型外 的函数要素都相同 那么编译器会报重定义错误