最新文章:Virson's Blog
1、对象由属性(Attribute)和服务(Service)两部分组成
2、对象的属性值只应由这个对象的服务来读取和修改
3、具有相似属性和行为的一组对象,成为类(Class)
4、在已有类的基础上通过增加新的特性而派生出新的类,称作继承;原有类称作一般类或基类,新建立的类则称为特殊类或派生类
5、继承意味着“自动拥有”或“隐含地复制”,即在定义新类时,只要将新类说明为某个一般类的特殊类,它就会自动的、隐含的拥有这个一般类的全部属性和服务;在特殊类中,这些属性和服务可以直接使用而不必重新定义
6、通过消息在对象之间进行通信是面向对象的一个基本原则
7、多态性的定义是:同一操作作用于不同的类的实例,将产生不同的执行结果,即不同类的对象收到相同的消息时,得到不同的结果。
8、多态性包含编译时的多态性、运行时的多态性两大类。即:多态性也分为静态多态性和动态多态性两种
9、静态多态性是指定义在一个类或函数中的同名函数,它们根据参数表(类型以及个数)区别语义,并通过静态联编实现,例如,在一个类中定义的不同参数的构造函数
10、动态多态性是指定义在一个类层次的不同类中的重载函数,它们一般具有相同的函数,因此要根据指针指向的对象所在类来区别语义,它通过动态联编实现,例,在用户不作任何干预的情况下,类的成员函数的行为能根据调用它的对象类型自动作出适应性调整,而且调整是发生在程序运行时,这就是程序的动态多态性,即,发出同样的消息被不同类型的对象接收时,有可能导致完全不同的行为
11、程序设计多态性的示例
多态性就是多种表现形式,具体来说,可以用"一个对外接口,多个内在实现方法"表示。举一个例子,计算机中的堆栈可以存储各种格式的数据,包括整型,浮点或字符。不管存储的是何种数据,堆栈的算法实现是一样的。针对不同的数据类型,编程人员不必手工选择,只需使用统一接口名,系统可自动选择。
举例子说明一下:
#include <iostream.h>
class A {
public:
virtual void test() { cout<<"aaa"<<endl; } //运行时的多态性,如果不加virtual就是编译时的多态
//void test() { cout<<"aaa"<<endl; }//编译时的多态性
};
class B:public A
{
public:
void test() {cout<<"bbb"<<endl;}
};
class C:public B
{
public:
void test() {cout<<"ccc"<<endl;}
};
void main()
{
C cc;
A *p=&cc;
p->test();
}
在Class A的test函数前加上virtual,即在运行时多态的时候,程序输出结果为:ccc
在Class A的test函数前不加virtual,即在编译时多态的时候,程序输出结果为:aaa
C++的多态性:在的函数前面加上Virtual关键字,在
派生类中重写该函数,运行时将会根据对象的实际类型来调用相应的函数。如果对象类型是派生类,就调用派生类的函数;如果对象类型是基类,就调用基类的函数。
12、私有成员只能被该类的成员函数所访问,从类外不能直接访问类的私有成员;公有成员是类的访问接口,从类外可以直接访问类的公有成员;保护成员的访问控制权限介于私有成员与公有成员之间,在该类的派生类中可以直接访问其基类的保护成员
13、动态联编
动态联编又称动态关联
定义:
编译程序在编译阶段并不能确切知道将要调用的函数,只有在程序执行时才能确定将要调用的函数,为此要确切知道该调用的函数,要求联编工作要在程序运行时进行,这种在程序运行时进行联编工作被称为动态联编。
动态联编必须包括以下方面:
成员函数必须声明为virtual
如果基类中声明了为虚函数,则派生类中不必再声明。
调用方式:
通过对象的指针或引用调用成员函数;或通过成员函数调用,反之就无法实现动态联编。
例如:
#include <iostream>
using namespace std;
const float pi=3.14159;
class circle1
{
public:
virtual float area( ) //把area声明为虚函数
{
radius=2.5;
return pi*radius*radius;
}
private:
float radius;
};
class circle2:public circle1
{
public:
float area( )
{
radius=5.5;
return pi*radius*radius;
}
private:
float radius;
};
void main()
{
while(true)
{
cout<<"请输入1或2.\n";
int choise;
cin>>choise;
circle1 *p; //定义一个类circle1的指针变量p
switch(choise)
{
case 1:p=new circle1;
break;
case 2:p=new circle2;
break;
default:break;
}
cout<<"the area of the circle"<<choise<<" "<<p->area()<<endl;
}
}
14、动态联编是实现多态性的一种重要形式
15、在C++中消息传递是通过成员函数调用来实现的
16、C++允许友元从类外直接访问类的私有成员
17、静态联编
静态联编是指联编工作出现在编译连接阶段,这种联编又称早期联编,它解决了程序中的操作调用与执行该操作代码间的关系。
静态联编
静态联编含义:
在编译时所进行的这种联编又称静态束定,在编译时就解决了程序中的操作调用与执行该操作代码间的关系。
例7.3.1 一个静态联编的例子。
#include<iostream.h>
class point{ private: float x, y;
public:
void setPoint(float I, float j)
{ x=I;
y=j;
}
float area( )
{ return 0;}
};
const float pi=3.14159;
class circle:public point
{ private: float radius;
public:
void setRadius( float r)
{ radius =r; }
float area( )
{ return pi*radius*radius;}
};
void mian()
{ point p;
float a=p.area();//调用point类的成员函数
cout<<"the area of the point p is"<<a<<endl;
circle c;
c.setRadius(2.5);
a=c.area(); //调用circle类的成员函数
cout<<"the area of the circle c is"<<a<<endl;
}
程序结果为:
the area of the point p is 0
the area of the circle c is 19.634937
18、#include是一条预处理命令,功能是要求编译器在对程序进行预处理时,将其后的文件的代码嵌入到程序中
19、cout是系统预定义的一个标准输出设备,一般代表显示器
20、cin是系统预定义的一个标准的输入设备,一般代表键盘
21、c++中标识符是严格区分大小写的,并且标识符只能由大/小写字母,数字(0~9)和下划线组成,并且第一个字符必须是字母或下划线
22、代码中的空白是空格、制表符(按Tab键产生的字符)、换行符(按Enter键产生的字符)和注释的总称,空白在编译的时候会被忽略
23、在用C++语言编写好源程序后,还需要进行编辑、编译、连接和运行四个步骤;“编辑”后保存成*.cpp文件,“编译”后产生二进制目标文件*.obj;“连接”(把目标文件和其他分别编译生成的目标代码模块(如果有的话)以及系统提供的标准库函数连接在一起,生成可直接运行的可执行文件)后产生可执行文件;“运行”可执行文件