linux c/c++面试知识点整理(一)

1、c/c++申请动态内存

       在c++中,申请动态内存是使用new和delete,这两个关键字实际上是运算符,并不是函数。
       而在c中,申请动态内存则是使用malloc和free,这两个函数是c的标准库函数,使用它们必须包含stdlib.h,才能编译通过。
       new/delete和malloc/free的相同之处在于,new和malloc都是手动申请动态内存,释放时new则需要delete释放内存,而malloc则需要free释放内存。
       它们的不同之处在于,new和delete会自动调用对象的构造和析构函数,而malloc/free则只申请内存。
       另外需要注意的是:new的不是数组的话,则直接delete就好,并且只会调用一次析构函数,而new[]的话,则需使用delete[]来释放,并且数组中每一个元素都会调用一次析构函数,调用完析构函数再释放内存。
demo如下:

#include <stdlib.h>  //malloc用到
#include <string.h>  //memset用到
#include <stdio.h>   //printf用到

int main()
{
    //malloc/free使用
    int *pmalloc = (int*)malloc(sizeof(int)*4);
    //注意malloc分配的内存一定要进行初始化,否则会出现一些奇怪的问题的哦
    memset((void*)pmalloc, 0, sizeof(int)*4);
    for(int i = 0; i < 4; i++)
    {
        pmalloc[i] = i;
        printf("pmalloc[%d]=%d\n", i, pmalloc[i]);
    }
    free(pmalloc);

    //new/delete使用
    int *pNew = new int;
    *pNew = 3;
    printf("pnew = %d\n", *pNew);
    delete pNew;

    //new[]/delete[]使用
    int *pNewEx = new int[4];
    for(int i = 0; i < 4; i++)
    {
        pNewEx[i] = i;
        printf("pNewEx[%d] = %d\n", i, pNewEx[i]);
    }
    //此处的[]千万不能掉,否则会导致内存泄露的
    delete[] pNewEx;

    return 0;
}

2、c++继承是什么以及它的优缺点

什么是继承?
       顾名思义,继承是一种物体对另外一种物体某些属性,动作的接续。举个例子,比如人这个个体,它的属性包括身高,体重等这些,它的动作则包括吃饭,喝水等等,那么如果另外要定义两种物体,男人和女人,那么这些属性和动作就都可以从人这个物体中继承下来,这,就是继承。当然,继承不只是这么简单,我们后续会陆续说到的。
demo如下:

#include <stdio.h>

class CPerson
{
public:
    CPerson()
    {
        height = 170;
        weight = 120;
    }
    ~CPerson(){}

    void DrinkWater()
    {
        printf("喝水\n");
    }

    void HavingDinner()
    {
        printf("吃饭\n");
    }

    int GetHeight()
    {
        return height;
    }

    int GetWeight()
    {
        return weight;
    }

private:
    int height;
    int weight;

};

class CMan : public CPerson
{
public:
    CMan(){}
    ~CMan(){}
};

class CWoman: public CPerson
{
public:
    CWoman(){}
    ~CWoman(){}

};

int main()
{
    CMan cMan;
    cMan.DrinkWater();
    cMan.HavingDinner();
    printf("男人身高:%d\n", cMan.GetHeight());
    printf("男人体重:%d\n", cMan.GetWeight());

    CWoman cWoman;
    cWoman.DrinkWater();
    cWoman.HavingDinner();
    printf("女人身高:%d\n", cWoman.GetHeight());
    printf("女人体重:%d\n", cWoman.GetWeight());

    return 0;
}
  • 优点:类继承是在编译时刻静态定义的,且类继承可以较方便地改变父类的实现,实现函数的重用。
  • 缺点:首先,因为继承在编译时刻就定义了,所以无法在运行时改变从父类继承的实现,其次,父类一般至少定义了子类的部分行为,父类的任何改变都可能影响子类的行为,也就是说,如果继承下来的实现不适合子类的问题,那么父类必须重写或者被其他的类替换,这种依赖关系限制了灵活性。

从以上对比看,同一种属性既可以是优点,从另外的方面来讲,又是缺点,就看个人在编程过程中的灵活运用了。

3、c++的三大特性

       封装、继承、多态。

  • 封装是一种技术,它使类的定义和实现分离;
  • 继承,从广义上讲,继承有三种实现方式,其一,为实现继承,指使用基类的属性和方法而无需额外编码,其二,可视继承,即子窗体使用父窗体的外观和实现代码,其三,则为接口继承,即仅仅继承属性和方法,实现则滞后到子类去实现,也就是父类使用的是纯虚函数,或者重写父类接口方法,则是虚函数,例如多态的实现就使用了接口继承。
  • 多态,简单来讲,就是父类定义了虚函数,子类重新实现该函数,那么当父类指针指向子类时,会调用子类的该方法,这,就是多态。
    下面是多态的demo:
#include <stdio.h>
#include <string.h>

class CPerson
{
public:
    CPerson()
    {
        height = 170;
        weight = 120;
        memset(sex, 0, sizeof(sex));
    }
    ~CPerson(){}

    virtual void SetSex() = 0;
    void PrintSex()
    {
        printf("我的性别是:%s\n", sex);
    }

private:
    int height;
    int weight;
//此处sex不能是私有,否则子类中无法使用,因为子类对父类的私有成员有继承权,但没有使用权,也就是只能看,不能摸
protected:
    char sex[8];

};

class CMan : public CPerson
{
public:
    CMan(){}
    ~CMan(){}

    void SetSex()
    {
        strncpy(sex, "男人", sizeof(sex)-1);
    }
};

class CWoman: public CPerson
{
public:
    CWoman(){}
    ~CWoman(){}

    void SetSex()
    {
        strncpy(sex, "女人", sizeof(sex)-1);
    }

};

int main()
{
    CPerson* pPerson = new CMan;
    pPerson->SetSex();
    pPerson->PrintSex();
    delete pPerson;

    CPerson* pPerson0 = new CWoman;
    pPerson0->SetSex();
    pPerson0->PrintSex();
    delete pPerson0;

    return 0;
}

4、子类和父类调用构造函数和析构函数的先后顺序

  • 子类对象定义时,先调用父类的构造函数,再调用子类的构造函数;
  • 子类对象销毁时,如果父类析构函数是虚函数,那么先调用子类的析构函数,再调用父类的析构函数,否则只会调用父类的析构函数;
    demo如下:
#include <stdio.h>

class CPerson
{
public:
    CPerson()
    {
        printf("建立父类\n");
    }
    //注意,父类析构函数一定要是虚函数,这样销毁子类时才会先调用子类的析构函数
    virtual ~CPerson()
    {
        printf("销毁父类\n");
    }
};

class CMan : public CPerson
{
public:
    CMan()
    {
        printf("建立子类\n");
    }
    ~CMan()
    {
        printf("销毁子类\n");
    }
};

int main()
{
    CPerson* pPerson = new CMan;
    delete pPerson;

    return 0;
}
执行结果如下:
建立父类
建立子类
销毁子类
销毁父类

5、什么是引用

引用,其实就是给变量取了一个别名,声明引用时要切记初始化,且引用本身不占存储单元,纯粹就是变量多了一个名称而已。
demo如下:

#include <stdio.h>

void setValue(int & p_iValue)
{
    p_iValue = 10;
}

void setValue1(int p_iValue)
{
    p_iValue = 9;
}

int main()
{
    int iValue = 8;
    int iValue1 = 8;
    setValue(iValue);
    printf("value=%d\n", iValue); //结果为10
    setValue1(iValue1);
    printf("value1=%d\n", iValue1); //结果还是8

    return 0;
}

6、将引用作为函数参数有哪些特点

  • 一是,使用引用传递参数是直接对实参本身进行操作,当需要在函数内部修改传递进来的变量并传出去时,可使用引用;
  • 二来,引用是无需重新分配存储空间的,但指针却需要,所以有时使用引用会更有效率;

7、什么时候需要使用常引用

       当既要使用引用提高程序的效率,又不能在函数内部修改实参的值时,可使用常引用。

8、将引用作为函数返回值类型的好处和需遵循的规则

       好处:在内存中不产生被返回值的副本
       需遵循的规则:
       (1)不能返回局部变量的引用;
        (2)不能返回函数内部动态分配的变量的引用,因为引用只是作为一个临时变量的出现,并未赋予一个实际的变量,该引用所指向的空间无法被释放;
       (3)可以返回类成员的引用,但最好是const类型;
       (4)为了保证连续使用流操作符(<< >>)重载返回值时,操作的是同一个对象,流操作符重载返回值应该声明为引用
       (5)+-*/这四则运算符不能返回引用

9、引用和多态的关系

       引用是c++中另外一种实现多态的手段,与指针一样,也是基类的引用可指向派生类的实例。
引用实现多态的demo如下:

#include <stdio.h>
#include <string.h>

class CPerson
{
public:
    CPerson()
    {
        height = 170;
        weight = 120;
        memset(sex, 0, sizeof(sex));
    }
    ~CPerson(){}

    virtual void SetSex()
    {
        strncpy(sex, "人", sizeof(sex)-1);
    }
    void PrintSex()
    {
        printf("我的性别是:%s\n", sex);
    }

private:
    int height;
    int weight;
//此处sex不能是私有,否则子类中无法使用,因为子类对父类的私有成员有继承权,但没有使用权,也就是只能看,不能摸
protected:
    char sex[8];

};

class CMan : public CPerson
{
public:
    CMan(){}
    ~CMan(){}

    void SetSex()
    {
        strncpy(sex, "男人", sizeof(sex)-1);
    }
};

int main()
{
    CMan cman;
    CPerson *pPerson = &cman;
    pPerson->SetSex();  //此处调用的是子类的SetSex
    pPerson->PrintSex(); 

    return 0;
}

10、引用和指针的区别

  • 指针通过某个指针变量指向某个对象后,对指针所指向的对象间接操作;
  • 引用本身就是变量的别名,所以对引用操作就是直接对所指向的变量进行操作;
  • 引用不会重新分配存储空间,但指针却需要重新分配存储空间;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,123评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,031评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,723评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,357评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,412评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,760评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,904评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,672评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,118评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,456评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,599评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,264评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,857评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,731评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,956评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,286评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,465评论 2 348

推荐阅读更多精彩内容

  • 1. C++基础知识点 1.1 有符号类型和无符号类型 当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值...
    Mr希灵阅读 17,966评论 3 82
  • 1. 结构体和共同体的区别。 定义: 结构体struct:把不同类型的数据组合成一个整体,自定义类型。共同体uni...
    breakfy阅读 2,118评论 0 22
  • const 引用 const 引用是指向 const 对象的引用:const int ival = 1024;co...
    rogerwu1228阅读 621评论 0 1
  • 收集非原创文章,如遇原作者,请私聊我,我会表明出处! 1--10 1. C++中什么数据分配在栈或堆,静态存储区以...
    Juinjonn阅读 4,939评论 0 30
  • C++知识50问1、C和C++的区别?C++相对于C的优势。答:C是C++的基础,C++是C的超集。C是一个结构化...
    萌面大叔2阅读 561评论 0 26