C++八股

1.define和typedef

        define只是简单的字符串替换,没有类型检查;是在编译的预处理阶段起作用;可以用来防止头文件重复引用;不分配内存,给出的是立即数,有多少次使用就进行多少次替换。

        typedef有对应的数据类型,是要进行判断的;是在编译、运行的时候起作用;在静态存储区中分配空间,在程序运行过程中内存中只有一个拷贝。

2.define和inline

        define定义预编译时处理的宏,只是简单的字符串替换,无类型检查,不安全。

        inline是先将内联函数编译完成生成了函数体直接插入到被调用的地方,减少了压栈、跳转、返回的操作,减少了普通函数调用时的额外开销。是一种特殊的函数,会进行类型检查;对编译器的一种请求,编译器有可能拒绝这种请求。(C++中inline编译限制:1.不能存在任何形式的循环语句;2.不能存在过多的条件判断语句;3.函数体不能过于庞大;4.内联函数声明必须在调用语句之前。)

3.重写(override)和重载(overload)

        重写是以实现不同的功能,一般是用于子类在继承父类时,重写父类方法。重写方法的参数列表、返回值、所抛出异常预备重写方法一致,被重写方法不能为private;静态方法不能被重写为非静态方法。

        重载,这些方法的名称相同而参数形式不同,一个方法有多个不同的版本,存在于一个类中。不能通过访问权限、返回类型、抛出异常进行重载。

        使用多态是为了避免在父类里大量重载引起代码臃肿切难于维护。

4.new和malloc

  • new内存分配失败时,会抛出bac_alloc异常,他不会返回NULL;malloc分配失败会返回NULL
  • 使用new无需指定内存块大小,而malloc需要显示的支出内存尺寸
  • new和delete可以被重载,而malloc/free不允许被重载
  • new/delete会调用对象的构造/析构函数以完成对象的构造/析构,malloc不会
  • mallc/free是C/C++标准库函数,new/delete是C++的运算符
  • new从自由存储区上为对象动态分配内存,malloc从堆上动态分配内存

5.constexpr和const

        const表示“只读”的语义,constexpr表示“常量”的语义。

        constexpr只定义编译期常量,而const还可以运行期常量。(一个变量/成员函数标记constexpr则它也顺带被标记为const,反之不然)。

constexpr函数是指能用于常量表达式的函数,函数体只有一条return 语句。被隐式转换内联函数

6.指针常量和常量指针

指针常量const int* d = new int(2);

常量指针int *const e = new int(2);

区别方法:左定值,右定向(const在*的左边还是右边)

若要修改const修饰的变量的值,需要加上volatile;

若要修改const成员函数中某些与类状态无关的数据成员,可以使用mutable关键字修饰数据成员

6.const和static的区别

修饰常量(非类中):const超出其作用域后空间会释放,在定义时必须初始化,之后无法更改,const形参可以接受const和非const的实参;static修饰常量函数执行后不会释放其存储空间

修饰成员变量:const修饰只在某个对象的生命周期内是常量;而对整个对象而言是可变的;不能赋值,不能在类外定义;只能通过构造函数的参数初始化列表初始化(原因:因为不同的对象对其const数据成员的值可以不同,所以不能在类中声明时初始化);static修饰只能在类定义体内部声明,外部初始化(且不加static)

修饰成员函数:const修饰是为了防止成员函数修改对象的内容(不能修改但是能够访问),const对象不能调用非const函数,但是非const对象可以调用;static修饰,作为类作用域的全局函数(不能访问非静态数据成员和调用非静态成员函数),没有this指针(不能直接存取类的非静态成员,调用非静态成员函数),不能声明为virtual

const和static不能同时修饰成员函数,因为静态成员函数不含有this指针,即不能实例化,而const成员函数必须具体到某一示例

7.通俗解释C++三大特性

继承:让某种类型对象获得另一个类型对象的属性和方法

封装:将数据和方法捆绑在一起,避免外界干扰和不确定性访问

多态:同一事物表现出不同事物的能力,即向不同对象发送同一消息,不同的对象在接收时会产生不同的行为(重载实现编译时多态,虚函数实现运行时多态);或允许将⼦类类型的指针赋值给父类类型的指针。

8.智能指针

提问:智能指针有了解吗:

答:智能指针是为了解决动态分配内存导致内存泄漏和多次释放同一块内存所提出的,在<memory>头文件中,包括:共享指针、独占指针、弱指针

unique_ptr:独享被管理对象指针的所有权,封装一个原始指针并负责其生命周期。当对象被销毁时,会在其析构函数中删除关联的原始指针。不支持普通的拷贝和构造,但可以move转移所有权

shared_ptr:使用引用计数实现对同一块内存的多个引用。每使用一次,内部的引用计数加一;每析构一次,内部引用计数减一,为0时删除所指向的堆内存。(1)同⼀个shared_ptr被多个线程“读”是安全的;(2)同⼀个shared_ptr被多个线程“写”是不安全的;

weak_ptr:为了解决shared_ptr循环引用问题。

9.C++内存模型

字符串操作函数——strcpy()

char *strcpy(char *strDest, const char *strSrc){//源字符串采用const修饰
    assert((strDest != NULL) && (strSrc != NULL));//空指针检查
    char *address = strDest;            //返回目标地址
    while((*strDest++ = *strSrc++) != '\0');  //while (*src!='\0') 
                                               //*dst++ = *src++; dst末尾没加'\0'
    return address;   //返回原始值 使函数支持链式表达式
}

字符串操作函数——strlen()计算给定字符串长度

int strlen(const char *str){
    assert(strt != NULL);
    int len;
    while((*str++) != '\0'){
        len++;
    }
    return len;
}

字符串操作函数——strcat()把src所指字符串添加到dest结尾处

char *strcat(char *dest, char *src){
    assert(dest && src);
    char *ret = dest;
    while(*dest){
        dest++;
    }
    while(*dest++ = *src++){}
    return ret;
}

字符串操作函数——strcmp()字符串比较函数 while(*str1 && *str2 && (*str1 == *str2)                                                                                str1++;str2++;

10、内存泄漏可以用Valgrind、mtrace检查

如何防止内存泄漏:将内存分配封装在类中,构造函数分配内存,析构函数释放内存;使用智能指针。

11.sizeof

char str[] = "hello";    sizeof(str) = 6;    --------------包含末尾结束符'\0'

char* p = str;             sizeof(p) = 4;       --------------32位系统下指针变量大小为4字节

void Func(char str[100]){}     sizeof(str) = 4;--------字符数组首元素的地址,大小为指针的大小

void* p = malloc(100);    sizeof(p) = 4;     ---------sizeof(p)为指针的大小,而不是动态分配内存大小

12.说一说进程的地址空间分布

从高地址到低地址,一个程序由命令行参数和环境变量、栈、文件映射区、堆、BSS段、数据段、代码段组成。

13.C/C++的内存分配方式

  • 从静态存储区分配:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,如全局变量、静态变量。
  • 从栈上分配创建:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但容量有限。
  • 从堆上分配(动态内存分配):程序在运⾏的时候⽤malloc或new申请任意多少的内存,程序员负责在何时⽤free或delete释放内存。动态内存的⽣存期⾃行决定,使⽤⾮常灵活。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值