【C++】牛客金典面试题

目录

1.必须在初始化列表初始化的成员变量和静态成员变量

2.友元函数

3.类模板

​4.Fibonacci数列

​5.引用和指针

6.拷贝构造

7.函数重载运算符

8.构造函数和析构函数

9.走方格的方案数


 

1.必须在初始化列表初始化的成员变量和静态成员变量

const修饰的成员变量:必须在初始化列表初始化

引用类型的成员变量: 必须在初始化列表初始化

静态成员变量(static修饰的):必须在类外初始化

const 和 static 同时修饰的成员变量:可以在类内初始化,不可以在初始化列表初始化,也可以在类外初始化

【C++】牛客金典面试题_第1张图片

 2.友元函数

友元函数可以看成是类扩展接口的组成部分

友元函数是在类外定义的,没有this指针 

友元函数的函数原型位于在类声明中,但并不是类的成员函数,在声明函数原型时,需要使用 friend 关键字。
友元函数的函数定义不需要 friend 关键字和 :: 运算符,和普通非成员函数是一样的
友元函数可以直接访问类的私有成员
通常在运算符重载中使用友元函数的情况是:重载的运算符的第一个参数不是该类的对象

【C++】牛客金典面试题_第2张图片

3.类模板

类模板就是一个框架,实际上是建立一个通用类,其数据成员、成员函数的返回值类型和形参类型不具体指定,用一个虚拟的类型来代表

类模板实际上是把类模板实例化成一个具体的类!

【C++】牛客金典面试题_第3张图片 4.Fibonacci数列

【C++】牛客金典面试题_第4张图片

#include 
using namespace std;

int main() {
    // a b cur
    //    a  b    cur
    int a = 0, b = 1, cur = 0;
    int n;
    cin >> n;
    while (n > cur) //cur更大的时候说明a和b把n夹住了,找到更小的距离
    {
        cur = a + b;
        a = b;
        b = cur;
    }
    cout << min(n - a, b - n) << endl;
    return 0;
}

5.引用和指针

【C++】牛客金典面试题_第5张图片

 本题的E错在:引用底层还是传指针

6.拷贝构造

ACD正确的叙述,会调用拷贝构造

新对象会调用拷贝构造

形参是实参的一份临时拷贝

【C++】牛客金典面试题_第6张图片

 B选项:用一个已经存在的对象赋值给另一个对象是赋值重载


 

【C++】牛客金典面试题_第7张图片

 【C++】牛客金典面试题_第8张图片

 7.函数重载运算符

成员函数运算符重载,运算符的元=参数个数-1

友元函数运算符重载,运算符的元=参数个数

比如成员函数重载+这个二元运算符,由于成员函数有隐藏的this指针,所以只需要一个参数

友元函数没有隐藏的指针 ,所以这个参数列表真的没有任何参数

没有参数你在做什么运算??????????????重载错误

【C++】牛客金典面试题_第9张图片


【C++】牛客金典面试题_第10张图片 

根据上面的分析,肯定是一元运算符,但是前缀还是后缀?

以示区分,后缀的参数列表会写上一个虚参数int,并没有什么实际意义

 

 8.构造函数和析构函数

定义指针变量的时候只会分配空间,不会初始化

【C++】牛客金典面试题_第11张图片 

【C++】牛客金典面试题_第12张图片 所以本题的指针pclassa在创建的时候不会调用构造函数,但是开辟了五个A类对象是要调用构造函数,析构只是delete pclassa(析构一次),所以只是释放了指针,但是指针指向的对象没有释放,这样的析构会造成内存泄漏


【C++】牛客金典面试题_第13张图片

 这个不能把构造函数设置成私有,那根本new不动

把析构函数设置私有,那么直接创建的对象不能编译器自动调用析构,会报错,而new出来的自己手动delete去调析构,就能释放

9.走方格的方案数

【C++】牛客金典面试题_第14张图片

 

#include 
using namespace std;
int ans(int n, int m)
{
    if (n == 0 || m == 0) //走到边界只有一种走法
        return 1;
    return ans(n - 1, m) + ans(n, m - 1); //n-1往下走,m-1往右走

}
int main() {
    int n, m;
    cin >> n >> m;
    int res = ans(n, m);
    cout << res << endl;
}

你可能感兴趣的:(c++,开发语言)