c++面试基础知识

本文涵盖了C++面试中的核心知识点,包括指针与引用的区别、智能指针、内存管理、函数调用、类型转换、容器与算法、类与数据抽象、面向对象编程等。深入解析了函数调用、内存分配、构造函数、析构函数、STL容器、迭代器的使用、类的访问权限等关键概念,并探讨了C++新特性。
摘要由CSDN通过智能技术生成

一.基本语言
1.请你说说fork,waitm exec函数
2.你回答一下静态函数和虚函数的区别
静态函数在编译期的时候就已经确定运行时期, 虚函数在运行时候动态绑定, 虚函数因为虚函数表的机制,调用的时候会增加一次内存开销
3.请你说一下重载和覆盖
4.请你说一说static关键字
5.请你说一下strcpy 和strlen
6.请你说一说c语言是怎么进行函数调用的?
7.请你说一说c语言参数压栈的顺序?
8. 请你说一说c++如何处理返回值?
9. 请你回答一下c++中拷贝构造函数的形参能否进行值传递?
10.请你回答一下malloc与new的区别?

首先,new/delete是C++的关键字,而malloc/free是C语言的库函数,后者使用必须指明申请内存空间的大小,对于类类型的对象,后者不会调用构造函数和析构函数

返回的指针需要强转。

11.请你说一说select.
12.请你说一下c++里是怎么定义常量的?常量存放在内存的那个位置?
13.请你说一下const修饰成员函数的目的是什么?
10. 如果同时定义了两个函数, 一个带const, 一个不带,会有问题吗?
11. 请你说一说隐式类型的转换?
12. 说一说你了解的类型装换
13. 请你说一说c++函数栈空间的最大值
14. 请你说一说extern "C"
15. 请回答一下new/delete与malloc/free的区别是什么?
malloc/free:是c的库函数, 使用时必须指定申请内存空间的大小,返回的指针需要强转.
new/delete:会调用构造函数, 不用指定内存大小, 返回的指针不用强转.
16. 请你说说你了解的RTTI
17. 请你说说虚函数表具体是怎样实现运行时的多态的?
18. 以下四行代码的区别是什么?
const char *arr = “123”;
char *brr = “123”;
const char crr[] = “123”;
char drr[] = “123”;
19. 请你来写个函数在main函数执行前先运行
__attribute((constructor)) void beore() { printf(“before main\n”); }
20. 请你说一下C++中析构函数的作用
21. 请你说一说你理解的虚函数和多态
22. 请你来说一下fork函数
23. 请你回答一下为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函                                 数
24. 说一下static 关键字的作用
25. 说一下c++与c 的区别 
26. 所以下c++中四种cast转换.

27. 所以c/c++中指针和引用的区别.

1.指针有自己的一块空间,而引用只是一个别名;
2.使用sizeof看一个指针的大小是4,而引用则是被引用对象的大小;

3.指针可以被初始化为NULL,而引用必须被初始化且必须是一个已有对象 的引用;

4.作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引 用的修改都会改变引用所指向的对象;

5.可以有const指针,但是没有const引用;

6.指针在使用中可以指向其它对象,但是引用只能是一个对象的引用,不能 被改变;

7.指针可以有多级指针(**p),而引用至于一级;

8.指针和引用使用++运算符的意义不一样;

9.如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄露。

29. 请你所以下你理解的c++中的四个智能指针.

  1. 数组和指针的区别
  2. 请你回答一下野指针是什么?
  3. 请你介绍一下智能指针
  4. 请你回答一下智能指针有没有内存泄露的情况,如何解决
    33.请你说一下i++和++i的实现
    34.请你说一下智能指针的实现
    二.容器与算法
    1.map和set 的不同,分别是怎么实现的?
    2.请你介绍一下STL的allocator?
    3.请你说一下STL迭代器删除元素
    4.请你说一下STL中MAP数据存放形式
    5.请你讲讲STL有什么基本组成?以及他们的关系?
    6.请你说一说STL中map的multimap
    7.请你说一说vector和list的区别,应用,越详细越好.  
    8.请你来说一下STL中迭代器的作用,有指针为何还要迭代器.
    9.请你说一下epoll原理.
    10.n个整数的无序数组,找到每个元素后面比它大的第一个元素, 要求时间复杂度为 O ( n ) O(n) O(n);
#include<iostream>
#include<vector>
#include <stack>
#include<cstdio>
#include<string>
#include <climits>
using namespace std;

vector<int> findMax(vector<int> num) {
    if (num.size() == 0) return num;
    vector<int> res(num.size());
    int i = 0;
    stack<int> s;
    while(i < num.size()) {
        if (s.empty() || num[s.top()] >= num[i]) {
            s.push(i++);
        } else {
            res[s.top()] = num[i];
            s.pop();
        }
    }
    while(!s.empty()) {
        res[s.top()] = INT_MAX;
        s.pop();
    }
    for (int i = 0; i < res.size(); i++) {
        cout << res[i] << endl;
    }
    return res;
}

int main() {
    vector<int> nums;
    for (int i = 0; i < 10; i++) {
        int temp;
        cin >> temp;
        nums.emplace_back(temp);
    }
    findMax(nums);
    return 0;
}
1 8 3 4 6 2 56 15 18 11
8
56
4
6
56
56
2147483647
18
2147483647
2147483647

11.请你说一下STL中resize和reserve的区别
三.类和数据抽象
1.请你说一说c++中类成员的访问权限.
2. 请你说一下C++中struct 和class的区别
3. 请你回答一下C++类内可以定义引用数据成员吗?
四.面向对象与泛型编程
1.请你说一下什么是右值引用,跟左值又有什么区别?
五.
1.请你说一下一个c++源文件从文本到可执行文件经历的过程?
2.请你来回答一下include 头文件的顺序以及双引号" "和尖括号<>的区别?
3.请你回答一下malloc的原理, 另外brk系统调用和mmap系统调用的作用分别是什么?
4.请你说一下c++的内存管理是怎样的?
5.请你回答一下什么是内存泄漏, 如何判断内存泄露(valgrind, 统计功能), 如何处理(varglind, mtrace)?
6.请你回答一下什么时候会发生段错误?
7.请你回答一下new和malloc的区别.
8.请自己设计一下如何用单线程的方式处理高并发.
9.请问c++有哪些新特性?

sizeof

1.定义一个空的类型,里面没有任何成员变量和任何成员函数.对该类型求sizeof,得到的结果是多少?
2.如果在该类型中添加一个构造函数和析构函数,再对该类型求sizeof,得到的结果有是多少? 
3.如果把析构函数标记为虚函数呢?

class A{
private:
	int value;
public:
	A(int n) { value = n; }
	A (A other) { value = other.value; }
	void Print() { std::cout << value << std::endl; }
};

int main () {
	A a = 10;
	A b = a;
	b.Printf();
	return 0;
}

分析运行结果

复制构造函数传入的参数是A的一个实例.由于是传值参数,我们把实参复制到形参会调用复制构造函数, 因此,如果允许复制构造函数传值,就会在复制构造函数内调用复制构造函数,就会形成永无休止的递归调用从而导致栈溢出.因此,C++的标准不允许复制构造函数传值参数,会编译报错,要解决这个问题, 我们可以把构造函数修改为A(const A &other), 也就是把传值参数改成常量引用.

数组

int data1[] = {1, 2, 3, 4, 5};
sizeof(data) = 4 * 5 = 20;
int *data2 = data1;
sizeof(data2) = 4;

数组中重复的数字

1.排序,遍历
2.哈希表, 时间复杂度为o(n)
3.重头到尾扫描这个数组的每一个数字, 当扫描到下标为i的数字时,首先比较这个数字m是不是等于i,如果是,则接着扫描下一个数字;如果不是,则再拿它和第m个数字进行比较,如果它和第m个数字相等,就找到一个重复的数字;如果它和第m个数字不相等,就把第i个数字的值和第m个数字的值交换,在对该位置的数字的值和下标进行比较.时间复杂度为o(n)

不修改数组找到重复的数字

用分治

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值