Windows程序设计笔记
宽字元:wchar_t 没有具体定义位数,但通常都是以0x00**表示,在内存中以 ** 00形式存储,因此用strlen不能读取字符长度
C语言中汉字需要用两个字节存储,字符串结尾通常会以/0来做标志,因此开数组的时候需要多开一位,sizeof的话也会多显示一位,输出汉字需要用连续两位ASCII码表示printf("%c%c",206,210);可以输出我,这里有篇文章是关于编码的来历的:这里
window程序设计不同于普通编程,windows编程是基于事件驱动编程模型,应用程序通过处理操作系统发来的消息相应事件,而一般编程则是从头到尾依次执行,中间会调用函数
windows的API函数封装在dll(动态链接库)中
静态变量
在介绍静态变量之前,先来介绍局部变量和全局变量。变量按照作用范围的不同可以划分为局部变量和全局变量。局部变量是指在函数内定义的变量,在函数调用结束后,局部变量将消失。而全局变量是指在函数体外定义的变量,它的生命期随着程序的结束而结束。静态变量主要是针对局部变量的,如果定义一个静态的局部变量,它的生命期在函数调用结束后会依然存在,在下次调用函数时,会依然保存上一次函数调用结束之后的值。并且,对于静态变量只执行一次初始化(无论函数调用多少次)。在C++中,静态变量是使用static关键字来定义的。
用static修饰后,输出0,1,2,3,。。。如果不用的话只会输出00000
外部变量:
外部变量用于告诉编译器在其他文件的全局区域存在一个全局变量,目的是在当前的文件中能够访问这个全局变量(意思就是说使其他文件也能访问它)
共用体Union,和结构体类型定义相似,但在同一时刻只能使用共用体中的一个成员,因为共用体所有成员共享相同的内存空间
内联函数 inline
所谓内联函数是指对于程序中出现函数调用的地方,如果函数是内联函数,则编译器直接将函数代码赋值到函数调用的地方,这样省去了跳转到函数定义的地方执行代码,然后再返回到调用函数处的一个过程,提高程序的执行效率。但是内联函数的一个最大缺点是增加了代码的程序,可以想下,如果一个内联函数有上千行的代码工程序中多次出现该函数的调用,执行程序的代码将是多么庞大。但是,对于代码较少、经常需要调用的函数,将其定义为内联函数,则可以显著提高程序的执行效率。
对象是类的实例化
public,protected,private
public编辑的成员(成员和方法)称为共有成员,public成员可以在程序的任何地方进行访问。protected标记的保护成员,该成员只能在该类和该类的派生类(子类)中访问,初次之外,程序的其他地方不能访问保护成员。private标记的成员称为私有成员,该成员只能在该类中访问,派生类以及程序的其他地方均不能访问私有成员
Union
输出266
#include<cstdio> union { int i; char x[2]; }a; int main() { a.x[0] =10; a.x[1] =1; printf("%d",a.i); }
用C++实现 strlen和strcpy
#include <assert.h> #include <stdio.h> int strlen(const char*str ) { assert( str != NULL ); int len = 0; while( (*str++) !='\0' ) { len++; } return len; } char* strcpy(char*strDest, const char*strSrc) { assert((strDest!=NULL) && (strSrc !=NULL)); char* address = strDest; while( (*(strDest++)=*(strSrc++)) !='\0' ) NULL; return address ; } int main() { char strDest[50]; int length = strlen( strcpy( strDest, "Hellossss") ); printf("%d\n",length); }
int main(){}必须返回0,表示成功,任何非0值都表示失败
<< (‘‘put to’’)
>> get from
& Ampersand
+x //unary plus
x%y // remainder (modulus) for integers
: colon
什么时候不用auto
We use auto where we don’t hav e a specific reason to mention the type explicitly. ‘‘Specific
reasons’’ include:
• The definition is in a large scope where we want to make the type clearly visible to readers
of our code.
• We want to be explicit about a variable’s range or precision (e.g., double rather than float).
constexpr: meaning roughly ‘‘to be evaluated at compile time’’
const int dmv = 17; // dmv is a named constant
int var = 17; // var is not a constant
constexpr double max1 = 1.4∗square(dmv); // OK if square(17) is a constant expression
constexpr double max2 = 1.4∗square(var); // error : var is not a constant expression
const double max3 = 1.4∗square(var); //OK, may be evaluated at run time
关于虚函数表:链接
C++ 值传递、指针传递、引用传递详解
C++ explicit关键字详解
关键字 const 是什么含意?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)
关键字volatile有什么含意并给出三个不同的例子
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量
1、编译器优化介绍
内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的方法有:将内存变量缓存到寄存器;调整指令顺序充分利用CPU指令流水线,常见的是重新排序读写指令。对常规内存进行优化的时候,这些优化是透明的,而且效率很好。
内联汇编的问题比较复杂。首先我们来看允许内联汇编之后的魔法有哪些
1. 无限栈,内联汇编直接操作寄存器,从此又诞生许多题。
2. 混淆代码,从此查作弊成了空想。
3. 越来越多的人会汇编之后,Arbitrary评测器的安全性堪忧,有朝一日必然爆炸。
MD5 链接