C++面试知识点总结

预处理


#宏定义求最大值  

>#define MAX(x,y) ((x)>(y)?(x):(y))


#const与define区别define 

>在编译前执行,无数据类型,仅仅在编译前做替换const存在于程序中数据段,分配空间,有数据类型

与C中#define的异同

在C++中的用法
1. 与C中#define相同的功能:字符替换
2. 保护数据
3. 结合引用传递,保护数据,提高效率

#const在C++中的作用

>修饰常量 : 编译器对其进行数据静态类型安全检查

>修饰形参 :func( A const &a); 传入a的引用可以提高效率,但引用容易改变原值,所以加const保护

>修饰函数返回值:当返回指针时给返回值加const , 则返回值不能被直接修改,并且赋值给 const修饰的变量

>修饰成员函数:对于不需要修改成员变量的成员函数,都应该加const以避免误修改成员变量。


#static有什么作用

>在函数体,维持静态变量在函数调用过程不变

>用来将变量或函数的作用于限制在本模块(文件)内

>static函数在内存中只有一份

>类中的static成员,所有对象共享。不属于具体对象,因此需要在类外面初始化,并且不能试用this指针


#.static全局变量/局部变量/函数  与 普通全局变量/局部变量/函数 的区别

a、全局变量:static作用域在当前文件(只能被初始化一次,防止在别的文件被引用)

b、局部变量:static变量只初始化一次,下次调用使用上次的值

c、函数:static函数在内存中只有一份,普通函数每调用一次都维持一份复制品。


#.C++中的static静态成员

a、静态成员变量目的:替代全局变量

b、特征:类定义前就已经分配空间,因此必须在类外面初始化

c、satic成员的引用:<类名>::<静态成员名>

d、satic属于整个类而不是某个对象,因此没有this指针,因此他只能访问类的静态数据和静态函数


static的两大特征 :
1. 持久性:值不变
2. 隐藏性:限定变量,函数,类成员的作用范围 
3. 封装性:作为类成员时,其他类无法访问,本类的不同对象可以访问(可用作对象通信的方式)


在C中的特性及用法
-声明及存储:存放在全局区,而不是程序堆栈中,因此每次调用值都一样
-仅在自己的作用范围可见(函数中,其他函数不可见;文件中,其他文件不可见),降低耦合度

在C++中的用法

#函数内部

#局部静态对象

#类中Static成员
        - 隐藏
        - 对象间数据共享(通信),数据持久
        - 默认初始化为0


#求以下sizeof空间占用

>char p[] = "Hello";                    // 6, p为数组,保存了 Hello+ ,  

>char p[20] = "Hello";                   //20 ,p为数组,20个元素

>char str[]="Hello"; char p = str;      // 4, p为指针

>void func( char p[100] ){}             // 4, p为指向数组的指针    

>void *p = malloc(100);                 // 4 , p为指向100字节堆内存的指针

>sizeof 一个空类对象                    // 1,普通函数不占空间,但编译器会安插一个char成员,以便可以分配地址

>sizeof一个含有虚函数的对象             // 4 ,虚函数指针(指向虚函数表)

>sizeof虚继承自A同时虚继承自B            // 8 ,针对每个基类的继承会有不同的虚指针


#.sizeof和strlen区别

char str[] = "hellow" , sizeof(str)=strlen("hellow")+1 


#.内联函数inline 与宏定义的区别

>inline在编译时展开,宏在预编译时展开

>inline函数可在编译时直接嵌入到目标代码,而宏只是做字符替换

>inline函数会对数据类型,语法进行检测,宏不会

>宏参数容易引起二义性

>inline是为了提高调用效率

>只有inline函数能访问类成员,宏定义则不行,起到封装性


引用和指针


#引用和指针区别

>初始化,引用创建的同时必须初始化。

>修改,引用初始化后不可在引用别的对象,但指针可以重新指向别的对象

>不存在 NULL 的引用 ,因此不需要在使用引用前检查引用的合法性

>基于以上两点,引用比指针安全


内存

#内存分配

>malloc , 分配sie个字节空间,未初始化

>calloc ,分配n块长度为size空间,已初始化

>reallc ,拓展空间到size

>new , delete ,在构造和析构函数中用来申请,释放内存


面向对象

#.构造和析构

a.构造可重载,析构不能

b.为什么基类的析构函数是虚函数:在析构时防止只析构基类而不析构派生类的状况发生





原文地址:https://www.cnblogs.com/fysola/p/4814835.html