最近招商银行的 24 届秋招已经开始了,有很多同学问我 C++ 能投银行吗?
银行的技术大多数都是 Java,但是我看银行后端开发和测开岗位的要求:熟悉Java/C++中至少一门编程语言。
所以,C++同学也是可以投银行开发的。今天分享,一位c++同学面招商银行测开岗位的面经,共问了 20+ 个问题,测开问的问题其实跟后端开发差不多,还是编程语言+数据库+计算机基础+算法这些,只是难度不会太深。
当然,还会额外问几个测试相关的问题,比如针对某个场景,你会如何设计测试用例?
所以,投了测开岗位的同学,可以去补充学习下这类的测试相关内容。
C++
1. float/double所占字节分别是多少?
float
类型占用4个字节,double
类型占用8个字节。
其他变量大小如下图:
2. 深拷贝和浅拷贝的区别?
- 浅拷贝是指将一个对象的值复制到另一个对象,包括对象中的数据和指向动态分配内存的指针。这意味着原始对象和拷贝对象将共享同一块内存,当其中一个对象修改数据时,另一个对象也会受到影响。这可能导致潜在的问题,尤其是在释放内存时可能会发生错误。
- 深拷贝是指创建一个新的对象,并复制原始对象的所有数据和指针指向的数据。这意味着原始对象和拷贝对象将拥有彼此独立的内存空间,彼此之间的修改不会相互影响。深拷贝通常需要在拷贝过程中分配新的内存,并将原始对象的数据复制到新的内存中。
3. ++i和i++的区别?
++i
和i++
都是C++中的自增运算符,它们的区别在于它们的行为和返回值。
++i
是前置自增运算符,它会先将变量i
的值加1,然后返回加1后的值。也就是说,++i
会先执行自增操作,再使用自增后的值。i++
是后置自增运算符,它会先返回变量i
的当前值,然后再将i
的值加1。也就是说,i++
会先使用当前值,再执行自增操作。
下面是一个示例代码,展示了++i
和i++
的使用:
#include <iostream>
int main() {
int i = 0;
std::cout << "Before increment: " << i << std::endl;
int result1 = ++i;
std::cout << "After pre-increment: " << i << std::endl;
std::cout << "Result of pre-increment: " << result1 << std::endl;
int result2 = i++;
std::cout << "After post-increment: " << i << std::endl;
std::cout << "Result of post-increment: " << result2 << std::endl;
return 0;
}
输出结果将是:
Before increment: 0
After pre-increment: 1
Result of pre-increment: 1
After post-increment: 2
Result of post-increment: 1
可以看到,++i
先将i
的值加1,再返回加1后的值,而i++
先返回i
的当前值,再将i
的值加1。
4. 多态是什么?怎么实现的?
C++的多态是通过虚函数(virtual function)和指向基类的指针或引用来实现的。在基类中声明虚函数,派生类中重写该函数,通过基类指针或引用调用该函数,就可以实现运行时多态。
多态的实现原理主要涉及到两个概念:虚函数表(vtable)和虚函数指针(vptr)。每个含有虚函数的类,或者从这样的类派生的类,都有一个虚函数表。这个表中存储了虚函数的地址。类的对象中包含一个虚函数指针,指向这个虚函数表。当我们通过基类的指针或引用调用虚函数时,实际上是通过这个虚函数指针找到虚函数表,然后在表中查找并调用相应的函数。这个过程是在运行时完成的,所以可以实现运行时多态。
多态性的实现主要依靠两个机制:继承和虚函数。
- 继承:派生类可以继承基类的属性和方法。通过继承,派生类可以具有基类的行为和特征。
- 虚函数:在基类中声明一个虚函数,派生类可以对该虚函数进行重写。通过使用虚函数,可以在运行时根据实际对象的类型来调用相应的函数,而不是根据指针或引用的类型。
实现多态的步骤如下:
- 定义基类:定义一个基类,并在其中声明一个或多个虚函数。
- 派生类:从基类派生出一个或多个派生类,并在派生类中重写基类的虚函数。
- 使用基类指针或引用:使用基类类型的指针或引用来引用派生类对象。这样做可以根据实际对象的类型来调用相应的函数。
下面是一个简单的示例代码,展示了多态的实现:
#include <iostream>
class Animal {
public:
virtual void makeSound() {
std::cout << "Animal makes a sound." << std::endl;
}
};
class Dog : public Animal {
public:
void makeSound() override {
std::cout <<