面试中常见的琐碎知识(一)
来源:互联网 发布:c语言cos函数怎么求 编辑:程序博客网 时间:2024/06/05 15:34
1.#ifndef | #ifdef
#define | #include
#else
#define | #include
#endif
作用就是在满足ifdef或ifndef的时候干一件事否则干另一件事,它的作用远远不止防止头文件的重复引用。
2.#undef xxx 是在后面取消以前定义的宏定义
3.回调函数
当函数指针作为参数传递给被调用的函数的时候,被调用的函数就可以通过这个函数指针调用外部的函数,从而形成了函数的回调。Window中WndProc就是回调的典型形式。在同文件中,一般可以不通过传入函数指针然后调用同文件中函数的,因为同文件中的函数可以直接调用。因此此时的作用并不明显。回调函数的一个最主要用途就是当函数处在不同的文件当中时(比如一个.cpp文件要调用另一个.cpp里的函数),此时就只能使用回调函数的形式)
4.句柄是唯一标识内核对象的整数值,以传参的形式传递给windows API以便于操作这些对象。句柄是与进程相关的,一个句柄可以被同义进程里的所有线程使用,但是如果将句柄值传递给另一个进程是不被允许的错误做法。
句柄就是windows系统中用于标识各种资源(如窗口、光标、图标等)的标识号,是一个整数值,有了这个标识号,我们才能对某个资源进行操作。
5.Windows核心编程对进程的理解:进程是有惰性的,它从来不执行任何东西,只是线程的一个容器。线程才是进程中执行代码处理数据的工具。同一进程空间的两个线程共享地址空间,因此他们可以执行相同的代码、处理相同的数据。此外,线程共享内核对象的句柄,因为句柄的分配针对的是进程而不是线程。
6.构造函数的构建
参看了ANSI C++的ISO标准,并从汇编的角度试验了几种主流编译器的行为,对于编译器提供默认构造函数的
行为得出了下面的结论:
如果一个类中没有定义任何的构造函数,那么编译器只有在以下三种情况,才会提
供默认的构造函数:
1)如果类有虚拟成员函数或者虚拟继承父类(即有虚拟基类)时;
2)如果类的基类有构造函数(可以是用户定义的构造函数,或编译器提供的默认
构造函数);
3)在类中的所有非静态的对象数据成员,它们所属的类中有构造函数(可以是用
户定义的构造函数,或编译器提供的默认构造函数)。
7.C++窗口类对象的生命周期和窗口的生命周期不是一致的。当一个窗口销毁时,与C++
窗口类对象没有关系,它们之间的纽带仅仅在于这个C++窗口类内部的成员变量:
m_hWnd,该变量保存了与这个C++窗口类对象相关的那个窗口的句柄。
另一方面,当我们设计的这个C++窗口类对象销毁的时候,与之相关的窗口是应该销
毁的,因为它们之间的纽带(m_hWnd)已经断了。另外,窗口也是一种资源,它也占据
内存。这样,在C++窗口类对象析构时,也需要回收相关的窗口资源,即销毁这个窗口。
因此,读者一定要注意:C++窗口类对象与窗口并不是一回事,它们之间惟一的关系
是C++窗口类对象内部定义了一个窗口句柄变量,保存了与这个C++窗口类对象相关的那
个窗口的句柄。窗口销毁时,与之对应的C++窗口类对象销毁与否,要看其生命周期是否
结束。但C++窗口类对象销毁时,与之相关的窗口也将销毁。
8. 设备描述表:windows中的一个数据结构,用来描述当前与硬件相关的信息。比如用来绘制的画笔的颜色、大小之类的信息。有了设备描述表,程序员就不需要直接和硬件打交道了(没有的话在画图、显示文字等的时候需要知道相应硬件的信息,如屏幕大小,驱动等)
当需要用自己定义的绘图工具(如画笔 画刷)绘制图形的时候,需要将自定义的工具选入设备描述符,实际上就是改写该数据结构中的信息,替换成自己的而已。
9. 屏幕设备描述表,一般我们简单地称其为设备描述表。它与显示设备具有一定的对应关系,在windows GDI界面下,它总是相关与某个窗口或这窗口上的某个显示区域。通常意义上窗口的设备描述表,一般指的是窗口的客户区,不包括标题栏、菜单栏所占有的区域,而对于整个窗口来说,其设备描述表严格意义上来讲应该称为窗口设备描述表,它包含窗口的全部显示区域。二者的操作方法完全一致,所不同的仅仅是可操作的范围不同而已。
10. 类的前置声明及其作用
例如:class B;
class A
{
public:
B* m_ptmp;
void out();
}
Class B;//前置声明 目的是当A类中要用到B类的时候提前告诉编译器 B这个类是被声明过的,是合法的一个类型。在下面情况下必须要前置声明:
有A、B两个类:class A 中用到class B的类型; class B中用到class A的类型。那么在编译的时候,如果先编译A类,编译器会发现B是未定义的类型,如果先编译B类,则会发现A是未定义的类型。此时就要用到前置声明,告诉编译器X类型是声明过的,是合法的类型,此时编译才能通过!
- 面试中常见的琐碎知识(一)
- 面试中常见的琐碎知识(二)
- 面试中常见的琐碎知识(五)
- 面试中常见的琐碎知识(四)
- 面试中常见的琐碎知识点(三)
- struts的一些琐碎知识(一)
- Java学习琐碎小知识(一)
- Android 琐碎小知识(一)
- struts的一些琐碎知识(二)
- 琐碎的小知识
- 琐碎的linux知识
- 一些琐碎的知识
- java琐碎的知识
- gradle 的琐碎知识
- 笔记中琐碎的知识点一
- C#面试中最常见的问题(一)
- Java中一些琐碎的知识和访问权限
- 开发琐碎(一)
- 企业知识管理安全
- “位域”与结构体内部对齐、结构体外部对齐(自己定义的)
- 通过WebView实现简单的浏览器
- 类型转换
- hdu ——3018——Ant Trip(一笔画问题)
- 面试中常见的琐碎知识(一)
- Sql 今天凌晨的时间
- 码流 / 码率 / 比特率 / 帧速率 / 分辨率 / 高清
- Modules, Ultimate, Styles, Popups and CheckBoxes- 2.9
- 面试中常见的琐碎知识(二)
- NSString / NSData / char* 类型之间的转换
- makefile实例
- POJ 3258 River Hopscotch
- Linux 与 Linux服务器之间文件传输方式之SCP