vc++ 1
q&a 2c++ 语法 2
杂项 2typedef 2
switch语句: 3
#include的写法 4
#define的用法: 4
声明: 4函数的整体结构 4
类 4抽象,继承,封装,多态性 5
虚函数 5纯虚函数 5
函数重载 5
const: 6
指针和引用传递参数 7
this指针 8
c++构造函数后面的冒号 8
用 const 限定类的成员函数 9
枚举 11c++头文件有 h和没有h的区别 12
vc++ 13
杂项 13控件的变量 13
串行化 13
一些常用的头文件 14
动态链表 14
vector 15
菜单 16文件操作 16
动态链接库 18
多线程 19
begin_message_map(cstudent, cedit)
//}afx_msg_map
end_message_map()
begin_message_map(cstudent, cedit),两个参数一定是子类和基类的关系吗?
文件写入打开的后缀怎么说。
类的定义都在。**件中。
用在旧的c**中,struct。以前的**中,声明struct新对象时,必须要带上struct,即形式为: struct 结构名对象名,如:
struct tagpoint1
int x;
int y;
struct tagpoint1 p1;
而在c++中,则可以直接写:结构名对象名,即:tagpoint1 p1;
typedef struct tagpoint
int x;
int y;
point;
point p1; /这样就比原来的方式少写了一个struct,比较省事,尤其在大量使用的时。
候,或许,在c++中,typedef的这种用途二不是很大,但是理解了它,对掌握以前的旧代。
码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的**。
通常讲,typedef要比#define要好,特别是在有指针的场合。请看例子:
typedef char *pstr1;
#define pstr2 char *;
pstr1 s1, s2;
pstr2 s3, s4;
在上述的变量定义中,s1、s2、s3都被定义为char *,而s4则定义成了char,不是我们。
所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一。
个类型起新名字。
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
此处由于加了typedef自定义了一个新类型sighandler_t,所以第二行的函数原型看起来顺眼多了,形式跟int func(char c, int i)无异,但是如果看不懂typedef语句,这两句话仍然是噩梦。
要理解typedef,只要记住一句话就差不多了,那就是:typedef在语句中所起的作用只不过是把语句原先定义变量的功能变成了定义类型的功能而已。
例如语句typedef int *apple;理解它的正确步骤是这样的:先别看typedef,就剩下int *apple; 这个语句声明了一个指向整型变量的指针apple(注意:定义只是一种特殊的声明),加上typedef之后就解释成声明了一种指向整型变量指针的类型apple。
现在,回过来看上面的这个函数原型typedef void (*sighandler_t)(int),盖住typedef不看,再简单不过,sighandler_t就是一个函数指针,指向的函数接受一个整型参数并返回一个无类型指针。加上typedef之后sighandler_t就是一种新的类型,就可以像int一样地去用它,不同的是它声明是一种函数指针,这种指针指向的函数接受一个整型参数并返回一个无类型指针。怎么样?
简单吧。再来做一个更酷的练习,请看:typedef char *(c[10])(int **p);
去掉typedef就变成char *(c[10])(int **p),先不管这个语句有多难看,它一定是声明了一个拥有10个元素的数组c对不对?okay没什么了不起的,只不过这个数组c的元素有点特别,它们都是函数指针,并且它们所指向的这些函数统统都接受一个二级指针然后返回一直指向字符型的指针。加上typedef之后,c就不是一个数组了,而是一种类型了。
注意break加了和不加的效果,不加的话会输出符合要求的语句及之后所有的语句。
main()
#include "没有分号,双引号。
#define idm_aboutbox0x0010
一般#define定义的都是大写。
#ifndef _afx_no_afxcmn_support
#include <>
#endif
#ifdef apstudio_invoked
#define _aps_next_symed_value101
#endif
声明变量 int a, b, c;
声明函数 int max(int a, int b);
一般在main函数之前进行函数的声明,然后main函数中调用,main函数的外面进行函数的编写。
class point
private:
int x; int y;
public:
float distance();
point (int a=2, int b=3) /构造函数,不具有返回值,构造函数可以重载,用不同的参数列表就可以。
//注意,即使没有内容也要有花括号。
friend int add(int a, int, b); 友元, 目的就是让特定的外部函数访问private的变量。
; /注意这里的分号,一定要有。
float point::distance() 注意,成员函数在类以外定义的话需要有::,如果在类内部定义不需要::,如果调用成员函数只要。就可以。
return sqrt(x*x+y*y);
//注意这里没有分号。
编译的多态性通过重载来实现,运行的多态性通过虚函数来实现。
基类的指针可以调用派生类,但是基类指针调用派生类的函数调用的还是基类的函数(重载的那些),这时可以用虚函数,将基类的函数定义为虚函数,此时基类指针调用派生类函数也会调用派生类的函数,虚函数在函数前**virtual关键字就可以了。
p->print调用基类的成员函数,而不是调用派生类的成员函数。
如果想调用基类的函数,需要用虚函数,virtual void print()
virtual double area()=0; /纯虚函数注意这里=0一定需要的,纯虚函数在基类中只是定义直接等于零,在派生类中重写。
派生类可以改写基类的成员函数,从而实现新的功能,这就是函数重载(就是重写一遍,当然参数列表要改动,返回类型也可以变动,但是不能只变动返回类型而参数列表不变),但是用基类指针指向派生类函数的时候,调用的还是基类的函数,这时注意基类的函数要声明成虚函数,这样基类指针指向派生类,并调用派生类函数的时候可以调用派生类的函数。
VC 学习笔记
vc 1 q a 2c 语法 2 杂项 2typedef 2 switch语句 3 include的写法 4 define的用法 4 声明 4函数的整体结构 4 类 4抽象,继承,封装,多态性 5 虚函数 5纯虚函数 5 函数重载 5 const 6 指针和引用传递参数 7 this指针 8 c 构...
VC学习笔记
进制转换字符串 char buf 8 int pname null itoa pname,buf,16 整形进制转换成进制字符串 this m pname buf updatedata false 格式化字符串 cstring pname int monname null s monname 格式化...
VC学习笔记
vc学习笔记。1.名词解析。1.1.atl atl,active template library活动模板库,是一种微软程序库,支持利用c 语言编写asp 以及其它activex程序。通过活动模板库,可以建立com组件,然后通过asp页面中的脚本对com对象进行调用。这种com组件可以包含属性页 对...