C/C++常见面试问题总结

1. static关键字作用

隐藏:不加statci的全局变量和函数具有全局可见性,可被其他源文件访问。添加static可以使得全局变量和函数对其他源文件隐藏,不可访问。
内容持久性:全局变量和添加static的局部变量存在静态数据区,只在程序开始运行时进行唯一一次初始化。
修饰成员变量:用static修饰类的属性和方法,使其成为类的属性和方法,即属于所有对象/实例共享的成员。

C中static用于修饰变量、函数。而C++还用于修饰类的成员变量和函数。

2. 引用和指针的区别

1.引用必须要初始化,如:int a; int &r=a;引用r为变量a的别名,和a指向同一块地址。(不能未初始化,直接int &rr)
2.指针存放的是数据的地址,
int a=1;
int &p;
p=&a,取址,存放a的地址;
*p=4,将p指向的地址中,值改为4,即a=4;
*取值运算符,&取址运算符)
3.综合1,2点也可知:引用不能指向空,指针可以。

3.头文件用<>和" "的区别

索引路径的区别,<>从标准库中查找;" "从当前工作路径中查找。

4.全局变量和局部变量存储位置有什么区别?

全局变量存在静态数据区,局部变量存在栈区。
若局部变量添加了static,则也会存在静态数据区。

全局变量静态全局变量局部变量静态局部变量
存储位置静态数据区静态数据区栈区静态数据区
可见范围所有源文件可见仅当前源文件可见仅当前函数可见仅当前函数可见

5.指针和数组的区别

指针:存放地址,通过地址间接访问数据。随意指向任意内存块。
数组:存放数据,直接访问。要么存放在静态区(全局),要么在栈区。

6.内存分配

栈区:存放函数的参数,局部变量等。程序结束会自动释放
堆区:存放动态数据,程序员手动释放
静态区:全局变量、static修饰的静态变量。自动释放
常量区:常量字符串。自动释放

7.数组指针和指针数组

数组指针:也称为行指针。指针地址+1,相当于移动一个数组的长度。
如: i n t   a [ 3 ] ; i n t   ∗ p = a ; p + + ; int \space a[3]; int \space *p=a; p++; int a[3];int p=a;p++;则此时p指向的是数组a末尾的下一个位置的地址,即a[3]位置.
i n t   a [ 3 ] [ 4 ] ; i n t   ( ∗ p ) [ 4 ] ;   p = a ; int \space a[3][4]; int \space (*p)[4];\space p=a; int a[3][4];int (p)[4]; p=a;此时p指向第一行 a [ 0 ] [ ] a[0][] a[0][],若p++,则p此时指向 a [ 1 ] [ ] a[1][] a[1][]

指针数组:指向数组中的每个元素。地址+1,相当于指向下一个元素。
如: i n t   a [ 3 ] ; i n t   ∗ p [ 3 ] ; p = a ; int \space a[3]; int \space *p[3];p=a; int a[3];int p[3];p=a;
此时p指向数组a的第一个元素a[0];
p++,则指向数组a的第二个元素a[1];

定义区别:
数组指针: ( ∗ p ) [ ] (*p)[] (p)[]
指针数组:* p [ ] p[] p[]

8. 关键字const的作用

定义一个只读的变量或对象。
修饰普通变量:变量不可变。如:const int a;常整型a不可变
修饰指针变量:
(1)常量指针:修饰指针指向的内容,如:const int *p=1;(或int const *p=&a;) 指针指向的内容不可变,但是指针是可以变的

(2)指针常量:修饰指针,如:int * const p=&a(a为变量);指针不可变,但是指针的内容是可以变的

(3)修饰指针和指针指向的内容,如:const int * const p=&a;指针和指针指向的内容均不可变

9. C中malloc和C++中new的区别

(malloc和free在C++中都可以使用)
malloc仅用于分配内存;new还可以用于创建类的对象/实例,调用构造函数。
free 仅用于回收内存;delete还可以用于销毁类的的对象,调用析构函数。
malloc和free是函数,返回空指针;new和delete是操作符,返回某种数据类型指针。

10. 数组a和&a的区别

int a[3]={1,2,3};
int *p=(int *)(&a+1);
cout<<*(a+1)<<endl:
cout<<*(p-1)<<endl;

则*(a+1)=2,a表示数组的首地址;
*(p-1)=3,&a是数组指针,+1表示移动整个数组长度。

11.面向对象的三大特征

封装:将客观事物抽象成类
多态:将父类设置成与一个或多个子对象相等。子类给父类赋值后,父类可以根据赋值进行特定的运行。
继承:父类可以被子类继承

12.构造函数和析构函数

class C{
C(){} //构造函数
~C(){}//析构函数
};

构造:C() {};创建类的对象时自动调用;没有函数返回类型;可以带参数;可以有多个(通过函数重载进行区分,即参数个数、类型的不同进去区分);
析构:~C(){};删除创建对象时自动调用;没有函数返回类型;不能带参数;只能有一个;

13.类的成员函数重写、重载、隐藏的区别

重写:重写函数和别重写函数在两个类中;参数列表必须相同;重写的基类中,被重写函数必须用virtual修饰
重载:在同一个类中;参数列表必须不同;可以被virtual修饰也可以不修饰;
隐藏:在不同类中;参数列表可以相同也可以不同

14.如何避免野指针

1.指针声明时未初始化:指针变量声明时进行初始化,或者指向NULL
2.指针被delete后没有置为NULL:指针指向的内存被释放后,指针应指向NULL
3.指针操作超越了变量作用范围:变量作用域结束前释放内存,并让指针指向NULL

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值