注意:总结参考 拓跋阿秀 大佬的面试网站
一. ++i 和 i++ 的区别
++i 和 i++ 都是C++中的自增运算符,它们的区别在于它们的行为和返回值。
行为:
- ++i 是前置自增运算符,它会将变量 i 的值加1,然后返回+1的值。就是说,先自增,再使用。
- i++ 是后置自增运算符,它会先返回变量 i 的当前值,然后再将变量 i 的值+1。就是说,先使用,后自增。
返回值:
- 前置返回一个引用,后置返回一个对象
//++i实现代码:
int& operator++(){
*this+=1;
return *this;
}
//i++实现代码
int operator(int){
int temp=*this;
++*this;
return temp;
}
- 前置不会产生临时对象,后置必须产生临时对象,临时对象导致效率降低。
二.函数的重载、重写(覆盖)和隐藏的区别
1.重载(overload)
重载是指在同一范围内定义的同名函数才存在重载关系。主要特点是函数名相同,参数类型和数目有所不同,不能出现参数个数和类型均相同,仅仅依靠返回值不同来区分的函数。重载和函数重圆是否虚函数无关。
class A{
virtual int fun();
void fun();
void fun(double val);
static int fun(char val);
...
}
2.重写(覆盖) (override)
重写指的是派生类中覆盖基类中的同名函数,重写就是重写函数体,要求基类函数必须是虚函数且:
- 与基类的虚函数有相同的参数个数
- 与基类的虚函数有相同的参数类型
- 与基类的虚函数有相同的返回值类型
//父类
class A{
public:
virtual int fun(int val){};
}
//子类
class B{
public:
//重写,一般加override可以确保是重写父类的函数
virtual int fun(int val) override{};
重载和重写的区别:
- 重写是父类和子类之间的垂直关系,重载是不同函数之间的水平关系
- 重写要求参数列表相同,重载则要求参数列表不同,返回值不要求
- 重写关系中,调用方法根据对象类型决定,重载则根据调用时实参表和形参表的对应关系来选择函数体
3.隐藏(hide)
隐藏是指在某些情况下,派生类中的函数屏蔽了基类中的同名函数,包括以下情况:
- 两个函数参数相同,但基类函数不是虚函数。隐藏和重写的区别就在于基类函数是否是虚函数。
#include<iostream>
using namespace std;
class A {
public:
void fun(int a) {
cout << "A" << endl;
}
};
class B :public A {
public:
void fun(int a) {
cout << "B" << endl;
}
};
int main() {
B* b=new B();
b->fun(0);
b->A::fun(0);
return 0;
}
- 两个函数参数不同,无论基类函数是不是虚函数,都会被隐藏。和重载的区别在于两个函数不在同一个类中。
#include<iostream>
using namespace std;
class A {
public:
void fun(int a) {
cout << "A" << endl;
}
};
class B :public A {
public:
void fun(char a) {
cout << "B" << endl;
}
};
int main() {
B* b=new B();
b->fun(0);
b->A::fun(0);
return 0;
}