直接上一些问题,做一下就知道自己可不可以了!

1 如何判断一段程序是C还是C++编译程序编译

参考答案
1
2
3
4
5
#ifdef __cplusplus //双下划线
cout << "C++";
#else
cout << "C";
#endif

2 C++值传递方式有哪几种?

参考答案
  • 指针传递
  • 引用专递
  • 值传递

在C语言中都可以认为是值传递。在C++中多了引用传递(1.在函数内部可以修改值;2.节省内存)。

为了提高效率,可以在函数传参时选择使用const refrence的方式节省对象拷贝创造副本造成的内存浪费

3 静态全局变量的作用域

参考答案

本文件中全局使用

4 虚函数

A中fun1()是否为虚函数、B中fun2()是否为虚函数?

1
2
3
4
5
6
7
8
9
10
11
12
class A {
virtual void fun1();
void fun2();
};
class b : class A {
void fun1(){
cout << "fun1()";
}
virtual void fun2(){
cout << "fun2()";
}
};
参考答案

A中fun1()和B中fun2()均为虚函数;其中如果父类函数为virtual,子类重写时,可省略virtual关键字。无论子类函数是否是virtual,子类与父类同名函数指的是不同函数。

  • 父类有virtual时,其子类必定是虚函数
  • 父类无virtual时,就要看其子类函数是否有virtual关键字,有就是虚函数。可以用高中生物遗传想这个问题。

5 C和C++中struct有什么区别?

参考答案
protection行为 能否定义函数
C 否,但可以有函数指针
C++ 有,默认是public 可以,包括构造函数,析构函数等

6 int id[sizeof(unsigned long)];这种写法是否正确?为什么?

参考答案

正确。sizeof()是编译时运算符,编译时就确定了,可以认为其实和机器有关的常量。所以sizeof(long)=4;,这句话相当于定义了一个大小为4的数组id;

1
2
3
cout << "sizeof(long):" << sizeof(long) << endl;
int id[sizeof(long)];
cout << "sizeof(id)" << sizeof(id) << endl;

面试经典1

7 变量的指针的含义是指变量的B.地址?

A. 值    B.地址     C.存储     D.名字

8 重载(overload)、重定义(redefintion)、重写(override)的区别?

参考答案
名称 名字空间 区别
重载 同一名字空间 是指允许存在多个同名函数,而这些函数的参数表不同。
重定义/隐藏 不同名字空间 用于继承,派生类与基类的函数同名,屏蔽基类的函数
重写/覆盖 不同名字空间 用于继承,子类重新定义父类虚函数的方法

9 多态的作用

参考答案
  1. 隐藏实现细节,是的代码能够模块化;扩展代码模块,实现代码复用
  2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。

10 多态中虚函数表什么时候建立

参考答案

虚函数表是在编译期就建立了。各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组,而对象的隐藏成员——虚拟函数表指针是在运行期——也就是构造函数被调用时进行初始化的,这是实现多态的关键。

11 面向对象的三个基本特征,并简单叙述

参考答案
  1. 封装:将客观事物抽象成类,每个类对自身的数据和方法事项protection(private,protected,public)
  2. 继承:广义的继承有三种实现形式:实现继承(使用基类的属性和方法而无需额外编码的能力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后带子类实现)。前两种(累继承)和后一种(对象组合=>接口继承以及纯虚函数)构成了功能复用的两种方式。
  3. 多态:是将父对象设置成为和一个或更多的与他的子对象相等的技术。赋值之后,父对象的就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单讲就是:允许将子类类型的指针赋值给父类类型的指针。

12 内联函数是否做类型检查

参考答案

内联函数要做参数类型检查,这是内联函数跟宏相比的优势。

13 内存分配的方式有几种

参考答案
  1. 静态存储区域。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。
  2. 在栈上创建。在执行函数是,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
  3. 从堆上分配,亦称动态内存分配。程序在运行的时候用mallocnew申请任意大小的内存,程序员自己负责何时使用freedelete释放内存。动态内存的生存期由我们决定,使用比较灵活,但问题也最多。很容易造成内存泄露、越界等问题

14 频繁使用的短小函数,在C语言中应用什么实现,在c++中应用什么实现?

参考答案

C用宏定义,C++用inline

15 全局变量和局部变量的区别

全局变量和局部变量有什么区别?是怎么实现的?操作系统和编译器是怎么知道的?

参考答案

生命周期不同:全局变量随主程序创建而创建,随主程序销毁而销毁;局部变量在局部函数内部,甚至局部循环体等内部存在,退出就不存在;内存中分配在全局数据区。

使用方式不同:通过声明后全局变量程序的各个部分都可以用到;局部变量只能在局部使用;分配在栈区。操作系统和编译器通过内存分配的位置来知道的,全局变量变量分配在全局数据段并且在程序开始运行的时候被夹在。局部变量则分配在堆栈里边。

16 如何判断一个操作系统是16为还是32位?

参考答案

定义一个指针p。打印出sizeof(p),如果节后是4,则表示该操作系统是32位;打印结果是2,则表示是16位。

17 上题在不能使用sizeof()情况下如何判断?

参考答案

超过32位时,这种方法不管用,最好的办法还是使用sizeof()

1
2
3
4
5
unsigned int a = ~0; // 最好是 unsigned int
if(a>65536)
cout << "32 bit" << endl;
else
cout << "16 bit" << endl;

18 如何处理内存耗尽

如果再申请动态内存时找不到足够大的内存块,mallocnew⬇️ 将返回NULL指针,宣告内存申请失败。如何处理内存耗尽?

new如果分配失败了会抛出bad_malloc的异常
malloc则会返回NULL
参考答案

如果返回的NULL,则马上使用人return语句终止本函数。

19 为什么要使用堆空间,使用堆空间的原因?

参考答案

直到运行时才知道一个对象需要多少内存;不知道对象的生存期到底有多长。

20 析构函数和虚函数的用法和作用

参考答案

析构函数是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没有重载,只有在类对象的生命期结束的时候,由系统自动调用。有适放内存空间的作用。虚函数是C++多态的一种表现,使用虚函数,我们可以灵活的进行动态绑定,当然是以一定的开销为代价。

21 错误的转移字符是A.091

参考答案
A. ‘\091'    B.'\\'     C.'\0'     D.'\''

22 引用和指针有什么区别

参考答案
  1. 引用不会开辟新的内存,是对引用变量地址的调用
  2. 引用必须被初始化,指针不必
  3. 引用初始化以后不能被改变,指针可以改变所指的对象
  4. 不存在指向空值的引用,但是存在指向空值的指针

23 直接在程序中填写数字或字符串,将会有什么麻烦?

参考答案
  1. 程序的可读性(可理解性)变差。程序员自己会忘记那些数字或字符串是什么意思,用户则更加不知它们从何处来、表示什么。
  2. 在程序的很多地方输入同样的数字或字符串,难保不发生书写错误。
  3. 如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错。

24 重复多次fclose一个打开过一次的FLIE *fp指针会有什么结果,并解释

参考答案

导致文件描述符结构中指针指向的内存被重复释放,进而导致一些不可预期的异常。

25 C++是不是类型安全

参考答案

不是,两个不同类型的指针之间可以强制转换(用reinterpret cast)

26 C++中是不是所有的动作都是main()引起的?

参考答案

不是。比如全局变量的初始化,就不是由main()函数引起的。举例:

1
2
3
class A{};
A a;// a的构造函数先执行
int main(){}
参考答案
参考答案
参考答案
参考答案
参考答案
参考答案
参考答案
参考答案
参考答案
参考答案
参考答案
参考答案
参考答案
参考答案
参考答案
参考答案
参考答案

当前文章还在编辑当中······

参考答案