前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >学弟学妹们,如果这五道题都不会,就不要出去面试C++了

学弟学妹们,如果这五道题都不会,就不要出去面试C++了

作者头像
liuzhen007
发布2021-06-29 15:54:29
4790
发布2021-06-29 15:54:29
举报
文章被收录于专栏:流媒体音视频

目录

第一题

第二题

第三题

第四题

第五题


「导读」出门闯荡江湖需要武艺傍身,出去面试也需要常规的技能加持。如果你想要面试C++的岗位,就需要具备一定的基础知识。不如现在就用这篇文章来检验一下自己的知识储备情况,能够全部答对的话最好,说明C++相关的基础知识掌握的不错;如果有一两道没答对或者不会,说明你还需要再努力一下,夯实基础很重要。题目经典,欢迎收藏!

第一题

面向对象编程的三大特征?

答案:继承、封装、多态。

知识背景

继承的目的是为了提高代码的复用性和可扩展性;封装的目的是为了保证变量的安全性,使用者不必在意具体实现细节,而只是通过外部接口即可访问类的成员;多态的目的是实现了动态联编,使程序编码效率更高,更容易维护和操作。这也是C++和C语言区别,C语言是面向过程的语言,他的核心是函数,而C++是面向对象的语言,他的核心是类和对象。其实,C++是C语言的超集。

这是相当基础的一个问题,面试的时候决定了你是否会被直接pass。如果你不会,那就要小心啦。

第二题

C++的内存有哪几种类型?

答案: 堆(malloc)、栈(stack)、程序代码区、全局/静态存储区、常量存储区。

知识背景

堆区:由new申请分配的内存块,我们通过应用程序来动态控制它们的申请和释放。如果程序没有正确释放它们,那么程序结束后,由操作系统自动回收。

栈区:由编译器自动申请和释放的内存块,通常用来存储局部变量、临时变量、函数参数。执行效率高,但是分配的内存容量有限。

程序代码区:存放程序二进制代码。

全局/静态存储区: 全局变量和静态变量是存储在一块的,程序结束后由系统释放。

常量存储区:存储常量的内存块,不允许被修改。

C++编程经常会涉及到内存的管理问题,所以对于C++内存的存储类型,我们还是很有必要掌握的!

第三题

哪些因素可能会影响到一个类的大小?

答案:非静态数据成员个数、是否有虚函数、对齐方式。

知识背景

一个类的大小 = 所有非静态数据成员大小 + 虚函数表 + 因对齐而多出的字节,其中,不论有多少个虚函数,都只有一个指向虚函数表的指针,占用4字节(32位系统)或者占用8字节(64位系统)。

引申出的题目:

在64位系统中,有如下类:

代码语言:javascript
复制
代码语言:javascript
复制
class C
{
public:
    char a;
    static char b;
    void *p;
    static int *c;
    virtual void func1();
    virtual void func2();
};
代码语言:javascript
复制
那么,sizeof(C)的数值是24?

面试时候很常见的题目,自己遇到的C++笔试题中,80%的时候遇到过。

第四题

在gcc环境下,已知数组int arr[5]={1,2,3,4,5};则*(*(&arr+1)-1)的结果是什么?

答案:5。

知识背景

如果想要获取某个变量的地址,可以使用取址运算符&,如果想要获取某个指针变量指向的数据,可以使用取值运算符*。

取址运算符&和取值运算符*在实际开发中几乎天天能够遇到,一定要重视!

第五题

请指出下列代码有几处错误?

代码语言:javascript
复制
代码语言:javascript
复制
#include<stdio.h>
class A
{
    public:
       virtual void f(){}
    public :
       A()
       {
           f();
       }
};
class B1:public A()
{
    private:
        char *_s;
    public:
        B1()
        {
            _s=new char[1024];
        }
    private:
        void f()
{
            delete _s[];
            _s=NULL;
        }
};
class B2:public A
{
    private:
        int * _m;
    public:
        B2()
        {
            _m=new int(2016);
        }
    private:
        virtual void f()
{
            delete _m;
            _m=NULL;
        }
}
int main()
{
    A* a1=new B();
    A* a2=new B2;
    delete a1;
    delete a2;
    return 0;
}

答案:4处,修改后如下所示:

line12 class B1:public A

line24 delete[] _s;

line43 };

line46 A *a1 = new B1();

知识背景

line12:继承语法错误,A后面不应该带括号。

line24:删除数组语法错误,中括号应该在数组变量前边。

line43:类定义语法错误,大括号后应该以分号结束。

line46:未定义错误。

都是一些基础的语法常识,一方面练眼力,一方面检验自己的实际编码能力。

怎么样?总共答对了几个?欢迎评论留言呦!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 玩转音视频 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第一题
  • 第二题
  • 第三题
  • 第四题
  • 第五题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档