EchoDemo's Blogs

C++中的问题整理(一)

1、#include<filename.h>和#include“filename.h”有什么区别?

答:对于#include<filename.h>,编译器从标准库路径开始搜索filename.h,而对于#include “filename.h”,编译器从用户的工作路径开始搜索filename.h。

2、在C++程序中调用被C编译器编译后的函数,为什么要加extern“C”?

答:C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为:void foo(int x, int y);该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int 之类的名字。C++提供了C连接交换指定符号extern“C”来解决名字匹配问题。

3、一个类有基类、内部有一个其他类的成员对象,构造函数的执行顺序是怎样的?

答:先执行基类的(如果基类当中有虚基类,要先执行虚基类的,其他基类则按照声明派生类时的顺序依次执行),再执行成员对象的,最后执行自己的。

4、New/delete与malloc/free的区别是什么?

(1)new/delete是C++的操作符,而malloc/free是C中的函数。

(2)new做两件事,一是分配内存,二是调用类的构造函数;同样,delete会调用类的析构函数和释放内存。而malloc和free只是分配和释放内存。

(3)new建立的是一个对象,而malloc分配的是一块内存;new建立的对象可以用成员函数访问,不要直接访问它的地址空间;malloc分配的是一块内存区域,用指针访问,可以在里面移动指针;new出来的指针是带有类型信息的,而malloc返回的是void指针。

(4)new/delete是保留字,不需要头文件支持;malloc/free需要头文件库函数支持。

5、Struct和class的区别是什么?

答:struct中成员变量和成员函数默认访问权限是public,class是private。

6、多态有哪些分类?

答:多态可以分为编译时多态和运行时多态。编译时多态可以通过函数的重载来实现,具体表现在根据参数的个数和类型的不同选择合适的同名函数。运行时多态通过虚函数实现,就是运行时根据对象类型自动选择正确的调用函数(也叫动态绑定)。模板属于编译时多态性,因为编译时自动根据模板生成模板函数。虚函数的动态绑定仅在基类指针或引用绑定派生类对象时发生。如果函数的形参不是指针或者引用,则调用哪个类的函数就已经确定。

7、为了提高访问内存的速度而进行内存对齐,说明内存对齐是什么?

(1)默认情况下,编译器的对齐系数为8

(2)内存对齐:就是每个成员的起始位置必须是对齐系数与成员自身大小二者中较小者的整数倍。

(3)内存补齐:取结构体或类的成员中最大的那个值,与对齐系统相比,取二者中的较小者。然后保证整个对象结尾地址的下一个地址是较小者的整数倍。

(4)结构体对齐除了第1点之外还要求结构体数组也必须是对齐的,也就是说每个相邻的结构体内部都是对齐的。

可以看一下这篇文章:http://www.cppblog.com/cc/archive/2006/08/01/10765.html

8、在win32中创建一个窗口需要设计一个窗口类,注册窗口类,创建窗口,显示及刷新窗口等几个步骤。

9、const 有什么用途?

(1)可以定义const常量。

(2)const可以修饰函数的参数、返回值,甚至函数的定义体。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。被const修饰的函数定义体的函数能被const或者非const对象调用,但是const对象只能调用被const修饰过定义体的函数。

10、什么是内联函数?

(1)编译器使用相应的函数代码替换函数调用,对于内联代码,程序无需跳到另一个位置处执行代码,再跳回来。因此,内联函数的运行速度比常规函数快,但代价是需要占用更多的内存。例如:如果程序在10个不同的地方调用了同一个内联函数,则该程序将包含该代码的10个副本。

(2)在函数声明之前加上关键字inline或者在函数定义之前加上inline。关键字inline必须与函数定义体放在一起才能使函数成为内联,仅将inline放在函数声明前面不起任何作用。

(3)定义在类声明之中的成员函数将自动地成为内联函数。所以不管是class声明中定义的inline函数,还是class实现中定义的inline函数,不存在优先不优先的问题,因为class的成员函数都是inline的,加了关键字inline也没什么特殊的。

(4)由于使用inline关键字的函数只是用户希望它成为内联函数,但是编译器有权忽略这个请求,比如:若此函数体太大,则不会把它作为内联函数展开的。内联函数定义也可以放在源文件中,但此时只有定义的那个源文件可以用它,而且必须为每个源文件拷贝一份定义(即每个源文件里的定义必须是完全相同的)。

🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------