首页 > 编程语言 >c++面试必问20题

c++面试必问20题

时间:2024-03-14 19:31:22浏览次数:17  
标签:必问 20 函数 对象 成员 多态 c++ 调用 指针

  1. 引用为什么不能修改引用关系?
  2. 什么是重载
  3. this指针如何在类中出现的?

类中的函数存放在代码区,所有对象访问的成员函数都是同一份代码,当不同对象调用同一个成员函数时,通过this区分在成员函数内修改的是哪个对象的成员变量

  1. this指针是否可以修改?

不可以,如果修改了this就无法在函数内区分修改的是哪个对象的成员变量了

  1. this指针主要起到什么作用?this指针是否占用对象内存?

用来分区分成员变量属于哪个对象的,区分参数和成员变量

  1. 构造函数特点,析构函数特点?

析构函数是释放成员变量指向的堆区内存

  1. 编译器会给类自动生成哪几个函数?

构造 析构 浅拷贝 赋值运算符

  1. 什么时候会调用拷贝构造

用已经存在的对象初始化新对象的时候

当参数或返回值以值的形式返回的时候

返回值以值的形式返回是一个右值

如果想让返回值以左值的形式返回,返回值应该为引用类型

  1. 拷贝构造的参数是什么?为什么?

引用:避免无限递归

万能引用:能接收左值也能接收右值,保护参数不被修改

  1. 深拷贝和浅拷贝的区别

浅拷贝是简单的赋值操作,浅拷贝会造成同一块内存多次释放,其中一个对象修改这块内存的数据另一个对象也随着修改

深拷贝会拷贝一份相同大小的内存,并且值也相同

  1. 常函数特点?

首先常函数中的this 和非常函数的this不同,常函数的this *左 和 *右都被const修饰了(但是有的编译器不同,面试官问的话就说在vs上自己看的),所以常函数不能修改成员变量,常函数不能调用非常函数,因为非常函数的this 只有*的右边被const修饰了类型不匹配。

  1. 常函数为什么不能修改成员变量?
  2. 常函数为什么不能调用非常成员函数?

  1. 静态成员函数有哪些特点?

 常函数能调用静态成员函数,因为静态成员函数没有this,所以不能调用非静态成员变量,也不能调用非静态成员函数(因为没办法给隐含参数this传值),可以通过对象或者类名调用公有的静态成员函数                                                                                                                                                                           

  1. 空指针可以调用成员函数吗?什么情况下不可以调用成员函数?

可以,成员函数里面访问成员变量时不能调用

  1. 简述下多态?以及动态多态的调用流程。

多态分为:静态多态和动态多态,静态多态:在编译期间就可以确定的多态例如函数重载和运算符重载和模板,函数重载在编译期间通过实参的类型能确定调用哪个函数。

动态多态:在运行期间确定的多态,父类指针或引用指向子类对象,在通过父类指针调用虚函数的时候,父类指针会通过对象里面的虚表指针找到虚表,然后在虚表中确定虚函数的地址进行调用。

  1. 虚表指针在什么时候被创建,虚标会占用对象内存吗?

创建对象的时候,在构造函数中被赋值,虚表在编译阶段被创建所有对象共享同一份虚标,虚表不占对象的内存,虚表指针会占用函数的内存。

  1. 什么时候使用虚析构?

一般在继承的时候使用虚析构,因为继承了就有可能会发生父类指针指向子类对象

  1. 什么是重写 覆盖 和隐藏

重写和覆盖是一个内容:首先在继承关系中父类函数是虚函数,子类中的返回值相同名字相同参数相同的函数 重写父类的虚函数也叫覆盖。

在父类和子类中不是重写就是隐藏

  1. 多继承时容易出现什么问题?怎么解决?

会出现二义性问题,往往使用作用域解决,菱形继承还可以使用虚继承解决

标签:必问,20,函数,对象,成员,多态,c++,调用,指针
From: https://blog.csdn.net/liiiiiiiiii123/article/details/136719637

相关文章

  • C++动态数组
    #include<iostream>usingnamespacestd;intmain(){ intt,i=0,j=0; cin>>t; char*pc=nullptr;//初始化 int*pi=nullptr;//初始化 float*pf=nullptr;//初始化 intsum=0; intFLAG=0; while(FLAG<t) { charch; cin>>......
  • 洛谷 P3596 [POI2015] MOD 题解
    题意简述给定一棵树,求断掉一条边再连上一条边所得的新树直径最小值和最大值,以及相应方案(你可以不进行任何操作,即断掉并连上同一条边)。题目分析假设我们枚举断掉某一条边,得到了两棵树,并且知道它们的直径分别为\(d_0,d_1\),那么如何连接一条边让新树的直径最大/最小呢?最大:显......
  • 洛谷 P3261 [JLOI2015] 城池攻占 题解
    题目分析其他人要么倍增,要么左偏树,那我就来讲讲朴实无华的dfs序加上线段树的做法。首先发现题目中明确指出了作乘法的时候一定是乘上一个大于零的数,这是为什么呢?首先把可以占领当前城池的战斗力的不等式列出来:\[h_j\le\left\{\begin{array}{c}s_i\timesv_j&&{a_j=......
  • 2024-03-14
    2024-03-14Riddle继续做上次没做出来的题2-SAT限制是如果一个点不选,那么与它相连的所有点都必须选如果一个点选了,那么和他在同一个部分的所有点都不能选对于边的限制直接建但是“部分”的限制直接建图是\(O(n^2)\)的优化方法是前缀优化建图对于每一个部分,用\(a_i......
  • CTF练习日记——[HCTF 2018]WarmUp 1
    一点进去就是一个大大的笑脸,暂时没有头绪,点开页面源码试试看发现了一个source.php,从这里入手试试呢能看到在source.php中有许多的if语句,猜测适用于验证过滤啥的,但看的不是太懂,一个个分析下先这里isset()验证变量是否声明,is_string判断是否是字符串,只要有一个不符合,就会输出......
  • CTF练习日记——[极客大挑战 2019]EasySQL
    启动靶机后,首先能看到这样一个界面:这个题是和SQL注入相关,首先随意输入username和password试试看:提示用户名和密码错误,那么我们尝试输入用户名输入1',得到提示SQL语句出错,那么我们就可以从这里下手,直接在用户名那输入1'or'1'='1#注入成功,得到了我们需要的flag:flag{08f72......
  • [Ynoi2013] 大学
    非常好之\(\texttt{lxl}\)使我的代码旋转。看到这个题,第一反应显然是如果我们能够每次确切的找到要除的数,然后用树状数组进行单点修改,那么就可以达到\(\mathcal{O}(n\logV\logn)\)的复杂度。那么接下来就是考虑如何去找到能除的数。首先,我们不难想到对于每个权值\(v\)......
  • 「PKUSC2022」雀圣 题解
    这边电脑的输入法要把我干烧了。。D2T3出这种模拟题,那简直不要太好。首先,不难想到暴力搜索要摸那些牌,然后丢哪些牌。然后手搓一些\(\texttt{check}\),这个应该都会,但是实际上比正解难写。我不知道\(\texttt{lay}\)打的什么东西,比我快20多倍,但是个人认为我这个思路挺暴力的。......
  • CTF练习日记——[极客大挑战 2019]Havefun 1
    开启靶机后,看到该界面,一只可爱的小猫,题目也没有更多信息,查看源代码试试看我们可以看到这样一段代码,我们试试cat=dog,发现结果自己出来了,得到了flag:flag{4962ffca-1564-415b-b9e0-77699a797784}......
  • 04_C++字符串_迭代器使用
    概念:迭代器是一种检查容器内元素并遍历元素的数据类型,通常用于对C++中各种容器内元素的访问,但不同的容器有不同的迭代器,初学者可以将迭代器理解为指针。1.使用迭代器使用begin和end,begin成员负责返回第一个元素(或者第一个字符)的迭代器。end成员返回指向容器“尾元素的下一个位置......