引用(reference)是为一个已声明的变量起一个别名。声明一个引用时需要在其名称前加符号“&”,并同时对引用进行初始化,即指定它所引用的对象(是哪一个变量的别名)。 声明一个引用一般采用如下格式: <数据类型> &<引用名> = <变量名>; 例如: int ActualInt; // 声明变量ActualInt int &OtherInt = ActualInt; // 声明变量ActualInt的引用OtherInt
一旦为一个变量声明一个引用,那么对这个引用的所有操作实际上都是对被引用变量的操作,它们代表同一个变量并且占用相同的内存单元。
例如,为变量i声明一个引用r,在程序中分别对r和i进行操作。当r变化时,i也随之变化,反之亦然。
void main(void) { int i=10; int &r=i; // r是变量i的引用型变量 r++; // 同时执行i++ cout<<\ i=88; // 同时执行r=88 cout<<\}
运行结果: i=11,r=11 i=88,r=88
内联函数的定义方法和格式:
inline 函数值的类型 函数名(形参及其类型列表) { 函数体 }
如:inline double square(double x) { return x*x; } void main() { double x;
cout<<”input a data”; cin>>x;
cout<<”the squre is “< ? 重载是C++提供的一个新特性。C++重载分为函数重载和运算符重载,这两种重载 的实质是一样的,因为进行运算可以理解为是调用一个函数。 ? 通过使用重载机制,可以对一个函数名(或运算符)定义多个函数(或运算功能), 只不过要求这些函数的参数(或参加运算的操作数)的类型有所不同。 ? 重载使C++程序具有更好的可扩充性。 为什么要使用函数重载 在原有C语言中,每个函数必须有其唯一的名称,这样的缺点是所有具有相同功能、而 只是函数参数不一样的函数,就必须用一个不同的名称,而C++中采用了函数重载后,对于具有同一功能的函数,如果只是由于函数参数类型不一样,则可以定义相同名称的函数。 函数重载是指一个函数可以和同一作用域中的其他函数具有相同的名字,但这些同名函数的参数类型、参数个数、返回值、函数功能可以完全不同。如: #include { cout<<\void whatitis(char c[]) { cout<<“this is string”< char c[]=\whatitis(i); whatitis(c); } 在本例中定义了两个名称都叫whatitis的函数,但它们的形参类型不同。因此,这两个函数就是重载函数。 ? 运算符重载:指对于不同数据类型的操作数,同一个运算符所代表的运算功能可以 不同。 ? 一个运算符定义了一种操作,一个函数也定义了一种操作,其本质是相同的,当程 序遇到运算符时会自动调用相应的运算符函数。 ? 虽然重载运算符完成的功能都能够用一个真正的成员函数来实现,但使用运算符重 载使程序更易于理解。 ? 与函数重载类似,编译器是根据参加运算的操作数的类型来识别不同的运算。 重载运算符的形式: 重载一个运算符,就是编写一个运算符函数,重载运算符(函数)的原型为: <数据类型> operator<运算符>(<形参表>); 运算符重载与函数重载的区别: ? 同一个重载运算符的参数个数是相同的。 ? 不能定义新的运算符,只能重载现有的运算符。 ? 运算符重载后仍然保持原来的优先级和结合性。 1.引用及声明方法 引用就是某一变量(目标)的一个别名,这样对引用的操作就是对目标的操作。 引用的声明方法: 类型标识符 &引用名=目标变量名; 如:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名 说明: (1)&在此不是求地址运算,而是起标识作用。 (2)类型标识符是指目标变量的类型。 (3)声明引用时,必须同时对其进行初始化。 (4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名。 (5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,所以系统并不给引用分配存储单元。 几点说明 由上例可看出: (1)传递引用给函数与传递指针的效果是一样的,这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。 (2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,这样形参与形参就占用不同的存储单元,所以形参变量的值是实参变量的副本。因此,当参数传递的数据量较大时,用引用比用一般变量传递参数的效率和所占空间都好。 (3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中需要重复使用“*指针变量名”的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。 参数传递方式: ? 值传递:单向 ? 按地址传递:双向 ? 引用传递:双向 例 实参与形参的值传递。调用函数后,实参a、b的值并没有发生改变。 #include void swap(int x, int y) // 函数定义 { cout<<\ x=\ y=\ int temp=x; // 交换形参x和y x=y; y=temp; cout<<\ cout<<\ x=\ y=\} main() { int a=20, b=40; cout<<\ cout<<\ a=\ b=\ swap(a, b); // 函数调用 cout<<\ a=\ b=\} 程序的输出结果为: before swap: a=20 b=40 x=20 y=40 after swap: x=40 y=20 a=20 b=40 引用作为函数参数 引用作为一般变量使用几乎没有什么意义,它的最大用处莫过于将其作为函数参数。在前面学习了按值传递和按地址传递两种参数传递方式,而引用传递与按地址传递在功能上很相象,可以在被调函数中通过改变形参来改变主调函数中的实参,但引用传递比按地址传递更简捷直观,也更好理解。 采用引用传递方式,只需在函数定义时使用引用作为形参,在函数调用时直接使用一般变量作为实参。 当引用被用作函数参数时,被调函数任何对引用的修改都将影响主调函数中的实参,被调函数对引用的操作即是通过实参的别名对实参进行操作。 什么是构造函数: 构造函数是一种特殊的成员函数,它是在创建对象时(声明或new动态创建)系统自动调用的成员函数。 什么是析构函数: 析构函数也是一种特殊的成员函数,它是在对象生存期结束时系统自动调用的成员函数。 构造函数的名称与类名相同,析构函数的名称必须在类名前加上“~”符号。注意,构造函数和析构函数不能指定任何返回值类型,包括void返回类型。 ? 多态性也是面向对象程序设计方法的一个重要特征,它主要表现在函数调用时实现 “一种接口、多种方法”。 ? 两种多态性:编译时多态性和运行时多态性。 ? 编译时多态性:在函数名或运算符相同的情况下,编译器在编译阶段就能够根据函 数参数类型的不同来确定要调用的函数 —— 通过重载实现。 ? 运行时多态性:在函数名、函数参数和返回类型都相同的情况下,只能在程序运行 时才能确定要调用的函数 —— 通过虚函数实现。 ? 派生类的对象可以认为是其基类的对象。C++允许一个基类对象的指针指向其派生 类的对象—— 这是实现虚函数的关键 如果想通过基类指针调用派生类中覆盖的成员函数,只有使用虚函数。 要将一个成员函数声明为虚函数,只需在定义基类时在成员函数声明的开始位置加上关键字virtual。 ? 抽象类是类的一些行为(成员函数)没有给出具体定义的类,即纯粹的一种抽象。 ? 抽象类只能用于类的继承,其本身不能用来创建对象,抽象类又称为抽象基类。 ? 抽象基类只提供了一个框架,仅仅起着一个统一接口的作用,而很多具体的功能由 派生出来的类去实现。 ? 虽然不能声明抽象类的对象,但可以声明指向抽象类的指针。 一个类如果满足以下两个条件之一就是抽象类: ? 至少有一个成员函数不定义具体的实现;(即 纯虚函数 ) ? 定义了一个protected属性的构造函数或析构函数。 ? 不定义具体实现的成员函数称为纯虚函数。纯虚函数不能被调用,仅起提供一个统 一接口的作用。 ? 纯虚函数的声明: ? virtual <数据类型> <成员函数名>(<形参表>)= 0 ; ? 当基类是抽象类时,只有在派生类中重新定义基类中的所有纯虚函数,该派生类才 不会再成为抽象类。 抽象是指对具体问题(对象)进行概括,抽出一类对象的公共属性和行为并加以描述的过程。抽象包括数据抽象和代码抽象(或行为抽象)。 封装是把每个对象的数据(属性)和操作(行为)包装在一个类中。一旦定义了对象的属性和行为,则必须决定哪些属性和行为只用于表示内部状态,哪些属性和行为在外部是可见的。 继承是指一个新类可以从现有的类派生而来。新类继承了现有类的特性,包括一些属性和行为,并且可以修改或增加新的属性和行为,使之适合具体的需要。 多态性是指类中具有相似功能的不同函数使用同一个名称来实现,并允许不同类的对象对同一消息作出的响应不相同。 消息用MSG结构表示: typedef struct tagMSG { HWND hWnd; // 目标窗口句柄 UINT message; // 消息标识 WPARAM wParam; // 消息参数1(附加信息,16位) LPARAM lParam; // 消息参数2(附加信息,32位) DWORD time; // 消息发送时间 POINT pt; // 消息发送时鼠标的屏幕坐标 } MSG; ? 类库是一个可以在应用程序中使用的相互关联的C++类的集合。 MFC作为一个Windows编程类库,它包含了200多个类,封装了Windows的大部分编程对象以及与它们有关的操作。 ? 虽然程序在功能上千差万别,但从本质上看,都可以分为用户界面设计、文件操作、数据库访问及多媒体使用等几部分,这些都可以通过一些类来实现。MFC提供了一个标准化的程序结构,使开发人员不必从头设计一个Windows应用程序。 ? MFC实际上是一个庞大的文件库,它由几百个执行文件和源代码文件(如H文件)组成。 ? MFC应用程序框架提供了构建应用程序所需要的类,在程序运行时能够生成运行时类的对象,如代表应用程序对象、文档对象、视图对象和框架窗口对象。应用程序对象theApp是一个唯一的全局变量,它的主要功能是通过调用WinMain()主函数启动程序的运行。 ? MFC应用程序框架也有一个作为程序入口点的WinMain()主函数,但在源程序中看不见该函数,它在MFC中已定义好并同应用程序相链接。 InitInstance()函数是派生类唯一需要重载的函数,它负责应用程序的初始化,如初始化数据、创建文档模板、处理命令行以及显示应用程序主窗口。

