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);
}
View Code

 

用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);
}
View Code

 

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关键字详解

Friend

冒号初始化

抽象类和接口的区别

 

关键字 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 链接

posted @ 2017-04-03 15:41  miao_a_miao  阅读(305)  评论(0编辑  收藏  举报