9月26日笔试总结

“重载”和“重写的区别”

重载

指函数名相同,但是它的参数表列个数或顺序,类型不同。但是不能靠返回类型来判断。

  • 相同的范围(在同一个作用域中) ;
  • 函数名字相同;
  • 参数不同;
  • virtual 关键字可有可无。
  • 返回值可以不同;

重写(也称为覆盖 override)

是指派生类重新定义基类的虚函数,特征是:

  • 不在同一个作用域(分别位于派生类与基类) ;
  • 函数名字相同;
  • 参数相同;
  • 基类函数必须有 virtual 关键字,不能有 static 。
  • 返回值相同(或是协变),否则报错;
  • 重写函数的访问修饰符可以不同。尽管 virtual 是 private 的,派生类中重写改写为 public,protected 也是可以的

注意:若已包含标准库头文件及相关命名空间,则系统不允许用户重写标准库函数

#include 和 #include”filename.h”的区别

#include系统检索头文件时 会先从系统文件里开始找
,再找其他地方。用于系统文件较快。

#include”filename.h”系统检索头文件时先从程序所处目录开始查找。
用于自定义文件较快。

参数传递的问题

1
2
3
4
5
6
7
int f(int a, int b, int c)
{
return 0;
}
int main(){
return f(printf("a"),printf("b"),printf("c"));
}

考虑如下两个问题:

  • printf的返回值
  • 参数入栈的顺序

printf的返回值

1
2
//函数原型,因此其返回值为int型数据
int _Cdecl printf (const char *format, ...);

函数实参传递的顺序

  • 在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

补充:

  • 模板的使用实际上是将类模板实例化成一个类。
  • 两个相同作用域内的函数 如果除了返回值类型外 的函数要素都相同 那么编译器会报重定义错误