C++研发工程师基本知识

来源:互联网 发布:模板windows桌面软件 编辑:程序博客网 时间:2024/05/05 07:32

1、面向对象的思想是什么?
答:就是把数据结构和对数据结构的操作封装在一个类里面。

2、什么是类?
答:把一些具有共性的对象集结成一个集合,这个集合就是类。

3、对象都具有两方面的特征,他们是什么?
答:对象都具有静态和动态的特征。
静态特征是指对象的一些本质属性,动态特征是指对象所表现出来的一些行为。

4、在头文件中进行对类的声明,在实现文件中进行对类的定义,这样做有什么意义?
答:这样做有利于提高编译效率,也有利于文件的层次分明,因为在编译过类的声明之后,再次调用类的声明就不会再次编译类的声明,从而提高编译的速度。

5、在类的内部定义成员函数,这种函数会有什么属性?
答:这种函数会自动生成内联函数,这种函数在函数调用的地方在编译阶段都会进行代码替换。

6、成员函数通过什么来判断对应的对象数据,为什么它能够区分?
答:通过this指针来区分,因为它指向的是对象的首地址。

7、C++类为对象自动产生的函数都有哪些?
答:默认构造函数、默认析构函数、拷贝构造函数、赋值函数

8、拷贝构造函数在哪几种情况下会被调用?
答:1、用一个对象来初始化另一个对象的时候
2.、当函数的形参为类的对象的时候也会调用
3、当函数的返回值为一个类对象的时候,这时会调用拷贝构造函数创建一个临时对象。

9、构造函数和普通函数有什么不同?
答:作用:构造函数是用来初始化一个对象的,为一个对象开辟空间。返回值:构造函数没有返回类型,而普通函数有返回类型。函数名:构造函数的名字必须和类的名字是一样的,而普通函数没有这个限制。

10、什么时候必须重写拷贝构造函数?
答:当对象里有指针开辟堆的空间时,就必须重写拷贝构造函数,不然就会出现在销毁对象空间的时候重复删除的错误。

11、构造函数的调用顺序是什么?
答:1、执行父类的构造函数
2、按类中定义变量的顺序初始化类的成员
3、执行构造函数体

12、在哪些情况下必须要用到构造函数初始化列表来初始化?
答:1:类中的成员有常量成员(常量必须在声明的时候赋值);
2:类中有引用成员(引用在声明的时候必须初始化);
3:类中包含有没有无参构造函数的类对象;

13、什么是常对象?
答:常对象就是被const修饰,在任何情况都不可以对其成员进行修改的对象

14、静态函数存在的意义?
答:静态函数就是被static修饰的函数,用来输出static变量,
因为类中的私有static变量在类外不可以被访问,可通过静态的类成员函数来输出。当类的构造函数是私有的时候,只能通过类名调用静态函数生成一个对象(单例模式)。在静态函数中也没有this指针。

15、在类外有什么方法可以访问到类的非公有成员?
答:通过设置类友元函数就可以访问到类的所有成员。类的共有函数成员,继承。

16、什么叫抽象类?
答:类中含有纯虚函数的类就是抽象类,抽象类不可以被实例化。不用做实例化对象,而只作为一种基本类型的类叫做抽象类。

17、运算符重载的意义?
答:为了使自定义类型的对象可以像内置类型运算那样操作。

18、不允许重载的五个运算符?
答:?:(条件运算符)、.*(成员指针访问运算符)、::(域运算符)、sizeof(长度运算符)、.(成员访问运算符)

19、stream运算符为什么不能通过类的成员函数进行重载?怎么解决?
答:因为通过类的成员函数进行重载的话,第一个操作对象必须是类对象,而stream的对象的第一个对象是要操作的对象。可通过声明为友元函数解决。

20、运算符重载的三种方式?
答:全局重载、成员函数重载、友元函数重载

21、拷贝构造函数和赋值构造函数有什么区别与联系?
答:联系:都是用一个对象去给另一个对象赋值
区别:拷贝构造函数涉及到创建一个新的对象。

22、在什么情况下需要调用到类的析构函数?
答:在对象的生命周期结束的时候(程序运行结束的时候);

23、对象之间是怎么实现数据共享的?
答:通过声明属于类的静态成员变量可以实现对象之间的数据共享

24、友元函数有什么特性?
答:1、友元关系不可以继承2、单向的

25、对对象成员进行初始化的次序是什么?
答:按照成员在类中声明的顺序进行初始化,与初始化列表中的顺序无关

26、类和对象之间的关系是怎样的?
答:对象是类的实例,类是对象的抽象表示。

27、对类成员访问的权限都有什么?
答:public、protected、private

28、const char*p 与char *const p的区别?
答:前者常属性修饰的是指针指向的对象,也就是指针指向的对象不可改变,后者常属性修饰的是指针本身,也就是指针所存的地址不可改变

29、是不是virtual在父类的函数中加了子类中的函数就可以不加?
答:virtual属性是会被隐形继承的。
子类中的函数virtual关键字可加可不加

30、函数重载是什么意思?它与虚函数有什么区别?
答:函数重载条件是:在同一个类中,函数名相同,参数不同。可以实现同样操作的函数操作不同的对象,它是在编译阶段通过函数的参数,函数的类型,函数的返回值来决定调用具体哪个函数,实现的是静态的多态。虚函数是在具有继承关系的两个类中,两个函数名相同,参数相同,基类函数的前面有virtual关键字。它的含义是在将来的派生类中对原有的函数的功能进行扩展,在程序运行的时候才决定调用的具体类函数,实现的是动态的多态。

31、构造函数和析构函数是否可以被重载?为什么?
答:构造函数可以被重载,重载需要的条件是参数的个数或参数的类型,构造函数可以传入不同个数的参数或不同类型的参数,因此可以重载;而析构函数就不可以重载,因为没有可变的参数,不满足重载的条件。

32、什么是回调函数,如何定义和实现一个类的回调函数?
答:回调函数是指在函数未定义的时候进行声明这个函数的存在,到具体调用函数的时候再调用具体的代码对事件进行相应。定义类的回调函数可以在函数前面加CALLBACK修饰。

33、虚函数是如何实现的?
答:在有虚函数的类中都有一个指向本类虚表的指针,虚表是存储本类所有虚函数入口地址的指针数组,在调用虚函数的时候,会根据具体的对象进行调用对象类的虚表,然后从虚表中找到存储调用函数入口地址的指针,返回函数指针到调用位置,实现动态多态。

34、main函数在执行之前,还会执行什么代码?
答:在主函数执行之前,会首先初始化全局变量。

35、一个没有任何变量的类,它的sizeof()会不会是零?如果不是零,解释为什么?
答:空类的大小不为零,在定义一个类的时候,编译器会为没有任何成员的空类用一个char类型的占位符,以标识这个类的所在的地址空间。如果是有虚继承的父类,那么这个类每多一个虚父类就多4个字节,用来存储父类的虚表指针。

36、delete 和delete []的区别?
答:前者是用于内置类型空间的销毁,后者是用于自定义变量的销毁,当然也可以用于内置类型空间的销毁。前者只调用一次析构函数,后者为每个对象都调用一次析构函数。

37、子类析构时要调用父类的析构函数吗?
答:会调用父类的析构函数,因为在每次生成子类的时候,都会调用父类的构造函数,而每调用一次构造函数都会为对象开辟一定的空间,因此也需要调用析构函数来销毁空间。同时构造函数和析构函数总是倒序调用的,所以在调用基类析构函数的时候子类信息已经被销毁了。

38、继承的优缺点?
答:优点:1、类继承在编译阶段就已经静态编译,可以直接使用。2、类继承可以使子类较为方便的改变父类的方法。
缺点:1、父类没有用的信息会造成派生类占用的空间浪费。
2、父类的改变会影响到子类的行为。
3、如果继承下来的父类不适合子类功能的实现,那么就需要重新选择父类,这限制了代码的复用性。

39、解释堆和栈的区别?
答:堆是由程序员自己分配和删除的空间,空间的大小受到计算机硬件内存大小的限制。
栈是由编译器在函数调用的时候对参数和局部变量进行入栈出栈,由系统自动分配。默认的栈的大小是1M。

40、一个类的构造函数和析构函数什么时候调用?是否需要手工调用?
答:在定义一个类对象的时候系统会自动构造函数为对象初始化,在对象生命周期结束的时候系统会自动调用析构函数释放对象的空间。

41、何时需要预编译?
答:在创建大型项目的时候,如果有很多模块都包含相同的文件,则可以将这些文件放到一个公共的头文件里面,这样就可以在编译过一次之后不必再编译,提高了编译的效率。

42、多态的作用?
答:1、实现隐藏细节作用,提高代码复用,扩展代码模块。
2、接口重用:为了在派生的时候家族的对象使用某一特定的方法的时候正确调用。

43、虚函数和普通成员函数的区别?内联函数和构造函数能否为虚函数?
答:虚函数在函数前面有virtual关键字修饰,有虚指针,有虚表。内联函数和构造函数都不可以声明为虚函数,因为内联函数实在编译阶段将函数体静态嵌入调用位置,而虚函数是在运行阶段动态绑定;构造函数也不可以声明为虚函数,因为虚函数是通过具体的对象在运行的时候动态绑定,而构造函数没有执行完成时连对象都还没有生成。

44、析构函数为什么要虚拟?
答:将析构函数设置成虚函数是为了防止内存释放的不彻底,造成内存泄漏。

45、类中private变量都可以由哪些函数访问?
答:友元函数、类的成员函数。

46、在什么时候需要用到常引用?
答:在不需要改动对象的成员和为了提高传递参数效率的时候,就传递常引用。

47、指针和引用的区别?
答:1、引用声明的时候必须初始化,指针不必。
2、指针可以为空,引用不能为空。
3、引用指向一个对象之后就不能该指向其他对象
4、Sizeof(指针)是4个字节,sizeof(引用)大小取决于对象大小。
5、获取指针的地址是得到指针变量的地址,获取引用地址是得到引用对象的地址。

48、实时操作系统的特性都有哪些?
答:在特定的时间内完成特定的任务,实时性和可靠性。

49、堆栈溢出一般都是什么原因导致的?
答:分配的空间没有及时释放

50、什么函数不能声明为虚函数?
答:1、构造函数(没有对象)
2、内联函数(在编译阶段已经静态的将函数代码嵌入到调用位置,没办法实现多态)
3、普通函数(没有对象)
4、静态函数(属于类,不属于某个对象)
5、拷贝构造函数(没有对象)

51、IP地址的编码分为哪几部分?
答:IP地址有两部分构成:网络号和主机号

52、不能为switch()函数的参数的是什么类型?
答:float类型不能为switch函数的参数

53、如何引用一个已经定义过的全局变量?
答:1、通过包含头文件的方式(编译的时候报错),
2、可以在文件的头部加上extern +类型+变量名,用来引进其他文件中已经定义过的全局变量(在链接的时候报错)

54、对于一个频繁使用的短小函数,可以通过什么方法来提高编译效率?
答:1、设置为inline函数 2、用宏定义取代

55、C++是不是类型安全的?
答:C++不是类型安全的,因为可以通过强制转换转换类型(reinterpret_cast)

56、没有任何成员变量和成员函数的类,所占的大小是多少?为什么?
答:如果是普通继承或者没有父类,那么这个类的大小是1,以一个char字节来标识每个对象在内存中的位置;
如果是虚继承,那么该类有多少个虚基类就有多少个虚指针。

57、简述数组和指针的区别?
答:数组是在内存中开辟一定大小的连续空间来存放元素;
指针变量是用来存储一个指向对象的首地址,本身只开辟了4个字节大小的空间(32位系统下)。
数组的首元素也是地址,但是这个地址不可以改变,而指针的地址是可以改变的。

58、C++中函数参数的传递方式?
答:1、值传递;2、指针传递;3、引用传递

59、内存的分配方式?
答:内存中总共有5个区,分别是:
1、常量区:用来存储常量和被const修饰过的变量
2、静态(全局存储)区:用来存储被static修饰过的变量或全局变量
3、堆区:由程序员来开辟和释放空间
4、栈区:调用函数的时候进行压栈入栈。存储函数中的参数和局部变量
5、代码区:存放程序员编写的代码。

60、“extern C”的作用?
答:因为C++中引进了重载机制,所以在C++编译器的时候,对函数处理的方式也不一样,比如将函数int fun(int)处理后命名为fun_int_int, 而经过C编译器编译后生成fun_int函数名,因此加上extern C是为了支持C命名机制。

61、如何创建新的进程和线程?
答:创建新进程:调用fork()(子线程)/ CreateProcess();
创建新线程:调用CreateThread();

62、SendMassage()和PostMassage()的区别?
答:SendMassage()是阻塞的,执行到这一句代码的时候,系统会等待消息处理,处理完成后才继续执行下一句。
PostMassage()是非阻塞的,执行到这一句代码不会被阻塞,而是继续执行下去,不管那句代码有没有执行完成;

63、CMemoryState()函数有什么作用?
答:用来查看内存状况,看是否造成内存泄漏

64、#include

1#include  < iostream >        #define MAXSIZE 102typedef int Elemtype34typedef struct _stack//栈的结构5、{6、  Elemtype arr[MAXSIZE];7int top;8、} stack;910bool InitStack(stack *s)//初始化堆栈11、{12、 s->top = -1;13、}1415bool IsEmpty(stack *s)//判断栈空16、{17if(s->top == -1)18return TRUE;19return FALSE;20、}2122bool IsFull(stack *s)//判断栈满23、{24if(s->top == MAXSIZE)25return TRUE;26return FALSE;27、}2829bool push(stack *s, Elemtype data)//压入栈30、{31if(IsFull())32return FALSE;33、 ++s->top;34、 s->arr[s->top] = data;35return TRUE;36、}3738bool pop(stack *s, Elemtype *data)//弹出栈39、{40if(IsEmpty())41、 {42return FALSE;43、 }44、 *data = s->arr[s->top];45、 -- s->top;46return TRUE; 47、}
0 0
原创粉丝点击