C++笔记(vc书籍的光盘)

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对话框。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值