1.C语言也可以面向对象面层,使用“函数指针结构体”为C语言找个“对象”,就是在结构体中定义函数指针。
2.GUID:global unique identifier,全局唯一标识符。用于在系统中唯一标识一个对象。
3.com是一个平台无关,分布式,面向对象的程序接口标准,一般用于扩展应用程序的功能,大多数微软公司开发的应用程序都支持com接口扩展,com程序一般是dll 文件,com程序被提供给主调程序调用,com 程序为主调程序提供固定的接口,主调程序先通过固定的函数接口来获取其他的接口。
4.GDI是Graphics device Interface (图形设备接口)的简称,当windows应用程序需要显示点。线。图像,文字等内容,在显示器或打印输入这些内容时,就需要使用到GDI。应用程序当然不能直接操作系统的硬件,比如显
卡,GDI 就为应用程序提供了相关的接口。
5.DC(设备上下文,Device Contexts)是 GDI 程序设计中最基本也是最重要的概念。DC 是一种对象,设定了图形输出的特性与属性。
一个 DC 所关联的设备驱动决定了通过此 DC 进行的图形输出操作(文字输出、绘制、填
充等)会被哪个设备(包括显示器、打印机、绘图仪)或设备的子区域(窗口客户端等)所
接收。DC 也可以只是设备全部输出范围的一部分。比如界面上某个窗口的客户区也可以有 DC
与之对应,对这样的 DC 进行操作只会影响到窗口客户区。
6.一个DC中还包括了一系列的图形对象,所谓图形对象会影响到对DC的输出操作的结果。
当一个应用程序创建一个 DC 时,系统会为 DC 创建默认的图形对象(路径和位图除外)。
7.字体:font,front:前面。clip:裁剪。
8.如果浏览器不小心关闭或者电脑重启,可以在浏览器的足迹里面看到上次浏览的网页。
9.SetWorldTransform 实现了坐标变换的功能。
10.为什么有的库需要自己定义很多种typedef。因为考虑到移植性,有的在16位机器上,有的在32位机器上,用途typedef定义,到时候只需要修改一下typedef就可以,而不必需要整体的数据类型都需要修改,
在16位平台上一个int 占用的是2个字节,而在32位平台上一个int占用的是4个字节,数据表示的范围都是完全不一样的。
如果在16位平台上我们用int定义了所有的变量,那么到了32平台上这些用int定义的变量我们都得考量一下是否合适,这个工作量就很大了,这就不叫移植了,快叫重构了。
OK,现在问题的关键是怎么保证同一个数据类型在不同平台上占用的字节数是一样的,而且表示的数据范围也是一样的。
typedef派上用场了。
在16位平台上我们重新定义一个类型
typedef int int_16;
在16位平台上今后就不用int定义变量了,全部用int_16定义变量
把这个16位平台平台移植到32位平台上再加上这句行不行呢?
typedef int int_16;
肯定不行啊,要改一改的,16位平台上的int_16占用的字节数是2个字节,表示的数据范围是32768 ~ 32767
那么在32位平台上,什么数据类型是占用2个字节,表示的数据范围也是32768 ~ 32767呢 ?是short int 啊
所以要把typedef int int_16; 改成typedef short int int_16;
这样在32位系统中所有的被移植过来的int_16变量不需要修改就能满足要求了。
11. 头文件重复引用不是在不同的文件中引用(如果在不同的cpp文件中引用,而这两个cpp会有关联,生成同一个exe),而是“被重复引用”是指一个头文件在同一个cpp文件中被include了多次,这种错误常常是由于include嵌套造成的。比如:存在a.h文件#include "c.h"而此时b.cpp文件导入了#include “a.h” 和#include "c.h"此时就会造成c.h重复引用。
头文件被重复引用引起的后果:
有些头文件重复引用只是增加了编译工作的工作量,不会引起太大的问题,仅仅是编译效率低一些,但是对于大工程而言编译效率低下那将是一件多么痛苦的事情。
有些头文件重复包含,会引起错误,比如在头文件中定义了全局变量(虽然这种方式不被推荐,但确实是C规范允许的)这种会引起重复定义。
12.#define a 或者#define a=2都是正确的,就像int a 和int a = 4;一个给变量赋值,一个没有。
13.typedef 和define的作用域
typedef:
如果放在所有函数之外,它的作用域就是从它定义开始直到文件尾;
如果放在某个函数内,定义域就是从定义开始直到该函数结尾;
#define:
不管是在某个函数内,还是在所有函数之外,作用域都是从定义开始直到整个文件结尾。
如:
typedef …//此处开始到文件结尾
#define …//此处开始到文件结尾
总结:
(1) 不管是typedef还是define,都不能在定义之前使用;
(2) typedef受函数范围影响,而define不受;
(3) 不管是typedef还是define,其作用域都不会扩展到别的文件,即使是同一个程序的不同文件,也不能互相使用。
14.使用typedef与define在定义指针类型时的区别:
#include <stdio.h>
#define P1 int* //这里分别用define和typedef两个整型指针类型;
typedef int* P2;
int main (void)
{
int a = 1, b = 2;
P1 p1, p2; //用define定义的,此时定义变量时相当于int *p1, p2;
P2 p3, p4; //用typedef定义的,此时定义变量时相当于int *p3, *p3;
p1 = &a, p2 = a; //此处若是p2 = &a的话,在编译时,编译器会提出警告。也就
//证明了p2是一个整型变量,而不是一个整型指针。
p3 = &b, p4 = &b;
printf ("This is the result of define: %d %d\n\n", p1, p2);
printf ("This is the result of typedef: %d %d\n\n", p3, p4);
return 0;
}
因为#define只做简单的类型替换。
15.extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找定义。
16.dllexport和dllimport的区别:
dllexport是在这些类、函数以 及数据的申明的时候使用。用过表明这些东西可以被外部函数使用,即(dllexport)是把DLL中的相关代码(类,函数,数据)暴露出来为其他应用程 序使用。使用了(dllexport)关键字,相当于声明了紧接在(dllexport)关键字后面的相关内容是可以为其他程序使用的。而 dllimport关键字是在外部程序需要使用DLL内相关内容时使用的关键字。当一个外部程序要使用DLL内部代码(类,函数,全局变量)时,只需要在 程序内部使用(dllimport)关键字声明需要使用的代码就可以了,即(dllimport)关键字是在外部程序需要使用DLL内部相关内容的时候才 使用。(dllimport)作用是把DLL中的相关代码插入到应用程序中。
_declspec(dllexport)与_declspec(dllimport)是相互呼应,只有在DLL内部用dllexport作了声明,才能 在外部函数中用dllimport导入相关代码。实际上,在应用程序访问DLL时,实际上就是应用程序中的导入函数与DLL文件中的导出函数进行链接。而 且链接的方式有两种:隐式迎接和显式链接。
隐式链接是指通过编译器提供给应用程序关于DLL的名称和DLL函数的链接地址,面在应用程序中不需要显式地将DLL加载到内存,即在应用程序中使用dllimport即表明使用隐式链接。不过不是所有的隐式链接都使用dllimport。
显式链接刚同应用程序用语句显式地加载DLL,编译器不需要知道任何关DLL的信息。
16.Windows系统已经为大多数的常见设备编写了驱动程序。系统的正常运行离不开驱动程序。
17.windows系统是用C语言开发的。windows应用程序api也大多为c形式,但是windows系统本身是很好的面向对象思想的体现。
18.x86就是我们一般用的32位的系统,x64就是64位的系统。
区别:
第一,设计初衷不同,64位操作系统的设计初衷是:满足机械设计和分析,三维动画, 视频编辑和创作,以及科学计算和高性能计算应用程序等领域需要大量内存和浮点性能的客户需求。她们是高科技人员使用本行业特软件的运行平台,而32位操作系统是为普通用户设计的
第二,要求配置不同。64位操作系统只能安装在64位电脑上(cpu必须是64位的)。同时需要安装64位常用软件以发挥64位的最佳性能。
第二,要求配置不同。64位操作系统只能安装在64位电脑上(CPU必须是64位的)。同时需要安装64位常用软件以发挥64位(x64)的最佳性能。32位操作系统则可以安装在32位(32位CPU)或64位(64位CPU)电脑上。当然,32位操作系统安装在64位电脑上,其硬件恰似“大马拉小车”:64位效能就会大打折扣。
第三,软件普及不同。目前,64位常用软件比32位常用软件,要少得多的多。道理很简单:使用64位操作系统的用户相对较少。因此,软件开发商必须考虑“投入产出比”,将有限资金投入到更多使用群体的软件之中。这也是为什么64位软件价格相对昂贵的重要原因(将成本摊入较少的发售之中)。
64位电脑虽然可以安装32位操作系统,但是32位电脑绝对不能安装64位操作系统。这点至关重要务必牢记,以避免盲目下载和安装。
19.如何看自己电脑能不能装64位操作系统呢,只要是双核或者双核以上,就可,单击我的电脑-》属性-》设备管理器-》处理器。如果处理器有两个或者两个以上,就可以。
20.x86平台的cpu有4个优先级,分别称为ring0,ring1,ring2和ring3.ring0是最高优先级,低优先级的代码不能读取高优先级的内存空间,一些特殊的操作只能在高优先级的情况下才能调用。这种优先级实现了很好的内核保护机制。程序在进行操作系统内核调用时,程序会从低优先级运行到高优先级,内核调用返回时会从高优先级变为低优先级。
21.volatile关键字的作用: C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量。
volatile 指出 i 是随时可能发生变化的,每次使用它的时候必须从 i的地址中读取,因而编译器生成的汇编代码会重新从i的地址读取数据放在 b 中。而优化做法是,由于编译器发现两次从 i读数据的代码之间的代码没有对 i 进行过操作,它会自动把上次读的数据放在 b 中。而不是重新从 i 里面读。这样以来,如果 i是一个寄存器变量或者表示一个端口数据就容易出错,所以说 volatile 可以保证对特殊地址的稳定访问。注意,在 VC 6 中,一般调试模式没有进行代码优化,所以这个关键字的作用看不出来。因为release版本对代码进行了优化,所以有时候在release模式下和debug模式下有没有volatile的影响很大。
22.一般的关键字都定义在数据类型的前面,像static,const,volatile等。转储文件就是dmp文件。
23.Rootkit是一种特殊的恶意软件,它的功能是在安装目标上隐藏自身及指定的文件、进程和网络链接等信息,比较多见到的是Rootkit一般都和木马、后门等其他恶意程序结合使用。Rootkit通过加载特殊的驱动,修改系统内核,进而达到隐藏信息的目的。
24.动态链接库是模块化的重要技术手段。在应用程序设计时,尽量将基础、公共的代码放置在dll中。如果开发的应用程序需要向其他应用程序提供支持,可以像sdk一样定义一系列头文件,在生成dll文件时,同时生成lib库文件。
25.syntax:句法,语言结构。synchronous:同步,asynchronous:异步
26.静态局部变量:
(1) 静态局部变量在静态存储区内分配存储单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,存储在动态存储区空间(而不是静态存储区空间),函数调用结束后即释放.
(2) 为静态局部变量赋初值是在编译时进行值的,即只赋初值一次,在程序运行时它已有初值。以后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时的 值。而为自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
(3) 如果在定义局部变量时不赋初值的话,对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符型变量)。而对自动变量来说,如果不赋初 值,则它的值是一个不确定的值。这是由于每次函数调用结束后存储单元已释放,下次调用时又重新另分配存储单元,而所分配的单元中的值是不确定的。
(4) 虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的,也就是说,在其他函数中它是“不可见”的。
<27>运算符重载本质上是操作具有基础数据类型的成员函数。参数为什么使用引用,因为防止重新拷贝一份,对资源造成浪费。
<28>当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。
<29>静态全局变量和全局变量的区别,静态全局变量只能在定义它的文件中使用,而全局变量使用extern关键字,可以在工程的其他文件中使用。
<30>#pragma pack() 能够取消自定义的对齐方式,恢复默认对齐。
<31>位图是windows用来储存设备无关和应用程序无关的图片的标准格式。
gif是web网页上常见的图片格式,gif适用于线条图形,具有实色的图片和色彩之间具有明显界限的图片。
jpeg是一种压缩结构,适用于自然景观图片。例如扫描的照片。
<32>指针就理解两个问题,指针本质上是地址,为什么要有指针类型,指针类型表明指针指向的内存块的大小是多少这个理解是错误的,应该是告诉指针指针每次偏移的单位是多少。指针的类型转换仅仅表明指针内存组织(指针偏移)方式变了。什么时候进行指针类型的强转?
因为值相同的两个指针,所指向的变量的值可以不同,就是指针移动的字节数量不同,可能读取出不同的值。可以参考这篇文章(https://www.cnblogs.com/chanabi/p/9228998.html)
<33>不管是什么类型的指针变量,所存的值都是地址(int类型的值,声明不同类型的作用是说明指针在内存中每次偏移的字节数)。
<34>Byte = 字节,bit = 位(二进制)
<35>static全局变量要定义在源文件中而不是定义在头文件中, 如果定义在头文件中,被其他源文件包含,其实是产生了两个变量。操作上互不干涉。
<36>为什么要有get和set方法:
比如 setAge(int age){ if(age<1||age>120) throw new Exception(” 你输入的年龄不合法”); }else{ this.age=age; } 这个是public变量做不到的。
如果你的变量score代表的是一个学生的数学成绩,理论上,分数只可能是0-100的整数,如果你把将score设为public,不用get()和set(),那么用户很可能会输入1-100以外的数字,如果你把将score设为privata,再用setScore()来设置分数,你就完全可以控制这种行为了。
就是遵循面向对象设计原则,设计者尽量隐藏类的内部实现细节,只对外提供接口;使用者不关心类的内部设计,只关注提供的功能。
控制类属性的合法性和正确性,防止类的属性被赋予非法值或恶意攥改。
<37>enum使用时要注意的细节:
第一个枚举成员的默认值为整形的0,枚举型是预处理指令#define的替代。用typedef定义的时候,比如
typedef enum Day
{
satarday,
monday
}Day; 前后的Day都可以省略。
<38>c语言的struct里面不能定义函数,只能定义指向函数的指针,c++的struct里面可以定义函数,C++的struct和class唯一不同点在于struct成员默认是公有的,class默认是私有的。
<39>c++中为什么struct默认是public,class默认是private?
struct的设计目的是让外部的程序访问其数据成员,class设计的目的是不让外部程序直接访问数据成员。
<40>出色的程序员写代码的时间非常少,大部分都是在思考。给你一个功能,需要根据自己有的基础知识在脑海中想怎么实现合理,高效,想清楚后再写,而不是边写边改边想,那么水平永远都是止步不前的抑或进步和蜗牛一样。