面试中常见的琐碎知识(一)

来源:互联网 发布:c语言cos函数怎么求 编辑:程序博客网 时间:2024/06/05 15:34

1.#ifndef | #ifdef

   #define | #include

   #else

   #define | #include

   #endif

  作用就是在满足ifdefifndef的时候干一件事否则干另一件事,它的作用远远不止防止头文件的重复引用。

2.#undef xxx 是在后面取消以前定义的宏定义 


3.回调函数

  当函数指针作为参数传递给被调用的函数的时候,被调用的函数就可以通过这个函数指针调用外部的函数,从而形成了函数的回调。WindowWndProc就是回调的典型形式。在同文件中,一般可以不通过传入函数指针然后调用同文件中函数的,因为同文件中的函数可以直接调用。因此此时的作用并不明显。回调函数的一个最主要用途就是当函数处在不同的文件当中时(比如一个.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类型是声明过的,是合法的类型,此时编译才能通过!