深圳融天云科公司Visual C++面试经验

Windows程序的入口是哪里?写出windows消息机制的流程

http://www.jobui.com/mianshiti/it/cpp/5059/

入口点是winmain函数;

Windows中有一个系统消息队列,对于每一个正在运行的windows应用程序,系统为它建立一个消息队列,即应用程序队列,用来存放该程序可能创建的各种窗口消息。应用程序中有一段“消息循环”代码,用来从消息队列中取出消息并分发到相应的窗口函数中。

 

Windows为当前正在执行的程序维护一个消息队列,当发生输入事件时,windows把事件转换为一个消息,并将消息放入程序的消息队列中。程序通过一块叫消息循环的代码从消息队列中取出消息:

while (GetMessage(&msg,NULL,0,0))

{

  //将msg结构传给Windows,进行一些键盘转换

  TranslateMessage(&msg);

  //将msg回传给windows,然后windows将msg发送给响应的窗口消息处理程序

  DispatchMessage(&msg);

}

Postmessage()将消息直接加入到应用程序的消息队列,不等程序返回就退出。Sendmessage()应用程序处理完该消息后,才返回。

http://blog.csdn.net/stpeace/article/details/8972881

 

 

深圳融天云科公司Visual C++面试经验_第1张图片

  1. 程序员实现winmain函数和窗口回调函数;
  2. Windows调用winmain()函数,启动应用程序,同时windows为应用应用程序建立一个消息队列,用于存储窗口消息;
  3. Winmain函数调用windows的API函数,比如createwindow和showwindow(),生成并显示一个窗口。调用createwindow()时会产生一个消息,但是该消息并不会添加到消息队列中,窗口回调函数依旧会处理该消息。
  4. Winmain()函数调用windows的api函数,比如GetMessage()从消息队列取出消息。假设用户在窗口中点击鼠标,windows会将该事件包装成一个消息并添加到消息队列,GetMeassage()取出该消息,并DispatchMessage()到windows;
  5. Windows会把该消息发送到窗口回调函数,并对函数进行调用。
  6. 窗口回调函数进行消息处理,通常的处理方式为调用windows api函数。

 

虚继承

http://www.cnblogs.com/BeyondAnyTime/archive/2012/06/05/2537451.html

什么时候使用常引用

临时对象都是常引用;

引用型参数尽量定义为常引用;

什么是死锁

模态对话框与非模态对话框的现象与本质区别

当程序显示一个模态对话框时,用户不能再对话框和该程序其他窗口键切换,用户必须先明确终止该对话框,通常点击OK或Cancel按钮来实现。

区别:

  1. 非模态对话框包括标题栏和系统菜单框。标题栏和系统菜单框允许用户将对话框移动到其他地方,通常不会为模态对话框提供标题栏和系统菜单框,因为用户无法为它下面的窗口做任何事情。
  2. 非模态对话框的样式语句必须包括WS_VISIBLE,如果不包含WS_WISIBLE就需要调用ShowWindow()c才能显示对话框。
  3. 非模态对话框的消息要进入你程序的消息队列,消息队列需要改动才能把消息传递给对话框窗口过程。具体做法:createDialog()时返回一个全局句柄hDialog,在消息队列中通过IsDialogMessage(hDialog,&sg)判断消息是否发送给对话框;终止对话框时,在windows对话框窗口过程的WM_CLOSE消息添加响应,DestroyWindow(hDlg);hDialog=NULL;

List和vector区别

Vector为存储对象分配连续的内存空间,随机访问效率高;在vector中插入或删除某个元素,需要对现有元素进行拷贝、复制,如果现有元素比较大或者说构造函数比较复杂,那么拷贝时开销就会比较大。对于简单的对象,vector优于list。Vector每次扩展容量时,将容量扩展为原来容量的2倍,对于小对象来说,效率还是很高的。

List是离散存储的,随机访问时需要遍历整个list。在list中插入删除元素,尤其是在首尾操作,效率很高,只需要修改指针。

Vector适用于元素数量比较稳定,对象简单,随机访问笔记频繁。

List:适用于对象数量变化大,对象复制,插入删除操作频繁。

熟悉设计模式吗,实现单例模式

http://www.cnblogs.com/cxjchen/p/3148582.html

 

A.exe及它包含的B.dll,C.dll,E.dll都包含common.lib,common.lib中包含static a,请问a在内存中的分布

键盘中输入一系列整数,以-1为结束,将输入的数据保存到data.txt中

int SavetxtFile()

{

         FILE *pf =fopen("data.txt","w+");

         if (!pf)

         {

                   puts("open file error!");

                   return -1;

         }

         int n;

         while (true)

         {

                   printf("input a num:");

                   scanf("%d",&n);

                   if (n==-1)

                            break;

                   fprintf(pf,"%d ",n);

         }

         fclose(pf);

         puts("ok");

         return 0;

}

C++程序中编译C语言函数后,为什么要加extern c

C++里面有函数重载机制,为了区分重载函数,编译时需要把参数信息写入函数名中,fun_int_int,这样就导致编译前后函数名不一致。

但C语言中没有重载机制,所以,在C++中声明C的函数原型或为C写函数实现时,需要加上extern c,加上extern c表明编译时这个函数要保留原有的函数名。

实现strcpy函数

实现strlen函数

实现字符串倒序

指针常量与常量指针

指针常量:

Int * const  p;

指针是修饰语,常量是本质;常量必须要初始化,初始化之后不可改变,所以最后,指针的地址值不可以改变。

该指针是一个常量,指针的地址不可以改变。

常量指针:

Cons tint *p;

它是一个指向常量的指针,就是指向对象是一个常量,不可以通过指针修改变量的值。

你可能感兴趣的:(Visual,C++开发,Visual,C++开发)