MFC:微软基础类库
创建VC程序时,类向导为每个头文件添加宏定义,防止头文件被重复引用和编译:
#if !defined(自定义名称)
#define 自定义名称
头文件内容
(这句宏定义应该是自动添加在每个头文件中,不用管)
#include <file.h>是引用系统头文件,可以省略.h后缀,只写文件名file
#include "file.h"是引用自定义头文件
源文件:.cpp为扩展名
逗号表达式,即(表达式1,表达式2),其最终值是表达式2,如果表达式1存在赋值运算,则优先进行。例如:
int iret;
int var =(iret=3*5,iret*4);
则var最终是60,先计算iret为15,再将15×4赋值给var.
C++提供三目元表达式,即var=(x>y)?x:y;
命名规则:常量大写;变量尽量不要加数字;
枚举类型:用于定义一篮子常量,代表各种状态值。例如:
enum var={OPEN=1,CLOSE,HIGH=5,LOW},如果{}内都没有赋值,默认是0,1,2递增;如果有指定值,则后面没赋值的是前面加1,CLOSE为2,LOW为6.
引用类型&,例如int &rvar=ivar;其中int ivar=10;则rvar和ivar使用作用相同。
typedef:定义新的数据类型。可用此类型声明变量。
例如,typedef int INTEGER; INTEGER a;
++运算:与赋值=存在先后顺序。
复合语句{},其内部定义的变量将被外部定义的同名变量取代。
return与exit区别:前者结束当前函数(可以是应用程序main函数),后者结束整个应用程序或进程。可以return x+y作为函数返回值。
如果函数没有返回值,例如void函数,那么就是以“return;”结束。
函数形参可以设置默认值,以便重复使用。有默认值的形参必须放在函数名括号最右侧,否则编译报错。例如,
int add(int x,int y,int z=10)
函数重载:函数名相同,但参数类型或个数不同。编译器根据调用情况决定使用哪个函数。
函数模板:函数体不变,但返回值和形参类型可变,适用于函数体相同,参数个数相同但类型不同的情况。使用template定义模板。例如:
template <class T1,typename T2>
T1 add(T1 a,T2 b)
{函数体}
其中的class与typename等价。
函数模板也可以重载,即可以定义同名的模板。
如果函数定义的内部变量与全局变量同名,则访问全局变量时,需加::符号。例如,
int var=10;
void main()
{int var=5;//内部变量,同名
printf("%d\n",var);//输出内部变量5
printf("%d\n",::var);//输出全局变量10
}
没有初始化时,全局变量默认值为0,局部变量默认值不确定。
命名空间:避免多个文件中同名全局对象之间的冲突。使用namespace定义空间。例如,
namespace spacex
{常量,变量,函数定义
}
使用“空间名::对象名”来调用空间内的对象。例如,
spacex::函数();
也可以使用“using namespace 空间名”来声明接下来的所有调用对象来自该空间,然后直接调用即可。
class与struct等价,这是为了继承C语言,结构体正常来说不应带有内部函数。class默认内部成员是私有的,struct默认是公有的,除非加以声明。
私有类成员函数只能在该类中调用,为其它函数服务。
类中成员的使用范围依次为:public,protected,private;其中protected允许该类及派生类调用,private只许该类调用。
类中的函数定义时,形参括号后面如果使用了const关键字,则代表该函数不会修改类中的数据成员,改了就非法。例如:
char * getname()const
{函数体}
class 类名;
类名 对象名;
对象名.成员名;
构造函数:类的内部与类同名的函数,用于给类的对象初始化,定义类时不允许直接初始化变量。例如:
class Time
{public:
Time()//构造函数
{hour=2;
}
void setTime();//其它函数声明
private:
int hour;
}
如果希望给对象进行不同的初始化,则需将构造函数带上形参,例如:
class Time
{public:
Time(int var)//构造函数
{hour=var;
}
void setTime();//其它函数声明
private:
int hour;
}
构造函数内部,使用“:变量名(默认值)”的方式对类的数据成员初始化,这叫参数初始化表。例如:
class Time
{public:
Time(int var1,int var2):hour(var1),sec(var2){}//构造函数
void setTime();//其它函数声明
private:
int hour;
int sec;
}
一个类中的构造函数可以有多个(即重载),它们必须带有不同的形参,用于不同的初始化对象。(推理:无参的构造函数只能有一个)。不写构造函数也可以,但默认没有初始化值。
析构函数:用于释放对象占用的空间,还可以在最后一次处理对象后,做出其它操作。与类同名,但前面加~。例如:
class Time
{public:
Time(int var1,int var2):hour(var1),sec(var2){}//构造函数
~Time()//析构函数
{cout<<"hello"<<endl;}
void setTime();//其它函数声明
private:
int hour;
int sec;
}
在main程序结束时,或者使用delete运算符时,会调用析构函数。
析构函数没有形参,每个类只能有一个析构函数。
静态类成员:在类定义中,使用static关键字定义的数据成员,既可以用类名.成员名访问,也可以用对象名.成员名访问。这个空间是提前分配的。
所有对象都使用同一个static成员,如果某个对象修改了该值,则其它对象也会被修改,相当于一个全局变量。而对于非静态类成员,每个对象都有自己的独立值。
this指针:指向对象地址,用于区分对象。在类的函数定义中,隐含了this指针。实际使用时感觉不到它的存在,调用哪个对象,this指针就会自动指向那个对象的地址。
运算符重载:采用operator关键字,在类的内部将运算符定义为新的功能,比如实现对象之间相加(实际是把对象内的数据成员相加)。但此时,交换律可能出错,因为重载是一种函数调用方式。
例如:
Class CBOOK
{public:
int m;
函数1;
CBOOK operator+(const CBOOK &a)//运算符重载
{CBOOK s;
s.m=m+a.m;//对象a的m与当前对象m相加
return s;//返回对象
}
}
CBOOK c,b,a;
a=b+c;
类模板,例如,
template <class T>
class Time
{private:
T aa;//aa可以是各种类型
}
类模板静态数据成员:用static定义在类中的变量。
异常处理,try,throw,catch。例如,
try
{
数据处理语句;//将被捕捉和检测
throw语句;//如果异常,则throw语句之后不被执行。
数据处理语句;
}
catch(条件成立)
{
异常情况下的语句;//如果检测到异常,则执行该语句
}
实际还是需要程序判断执行。如果不定义异常处理过程,则出错时可能弹出windows对话框。