part-03 知识总结

注意:总结参考 拓跋阿秀 大佬的面试网站

一. ++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
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
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;
}

你可能感兴趣的:(#,面试总结(C++),算法)