/*
//2009年10月28日14:40
面向对象的思想和技术:
对象(Object):客观世界中的任何事物都可以看做是一个对象
封装(Encapsulation):将一些数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间相互独立,互不干扰。
信息隐蔽(Information hiding)
抽象(Abstraction):抽象表示了一类事物的本质
继承与重用(software reusability)
多态性(Polymorphism)
面向对象分析(Object oriented analysis OOA)
面向对象设计(Object oriented design OOD)
面向对象编程(Object oriented programing OOP)
面向对象测试(Object oriented test OOT)
面向对象维护(Object oriented soft Maintenance OOSM)
类的声明:
class 类名
{
public:
公用的数据和成员函数;
private:
私有的数据和成员函数;
};
public , private (成员访问限定符 member access specifier)
如果没有限定说明 默认为private。
struct 和 class 的区别在struct的成员默认public,而class默认private。
类的成员函数在类外定义:
functionReturnType className::functionName(… …)
inline成员函数:
在类体中定义成员不包括不包括循环等控制结构 C++自动将其作为内置函数处理,所以可以不必进行显示的inline声明。
类外定义的函数系统不会默认将其作为内置函数,如果要将其内置则必须显示声明inline。
对象的存储中 数据和操作分开
对象成员的访问:对象名.成员名; 指针名->成员名; (*指针名).成员名;
引用访问:
Time t1;
Time &t2 = t1;
cout<<t2.hour;
类的公有接口和私有实现的分离 形成了信息隐蔽
当接口与实现(对数据的操作)分离时,只要类的接口没有改变,对私有实现的修改不会影响程序的其他部分。
类声明文件就成为用户使用类的公用接口,包含函数定义的文件就是类的实现。
类和对象的进一步讨论:
构造函数(constructor):
和类名相同,在建立对象时自动执行,没有类型,不返回任何值
构造函数名(类型1 形参1,类型2 形参2,……)
参数初始化表:
Box::Box(int h,int w,int len):height(h),width(w),length(len){}
有带有默认参数的构造函数后,不能进行构造函数的重载,不能有不带参数的构造函数。
析构函数(destructor):
作用与构造函数相反,名称是类名前面加一个'~';
当对象的生命周期结束时,会自动执行析构函数。
析构函数并不是删除对象,而是在撤销对象占用的内存之前完成一些清理工作,析构函数不返回任何值,没有函数类型,没有函数参数,不能重载,一个函数中能有一个析构函数。 可以用来执行用户希望在最后一次适用对象之后所执行的操作。
构造函数和析构函数的调用顺序:
先构造的后析构,后构造的先析构,相当于一个栈,先进后出。
对象数组
Student stud[50];
Student stud[3] = {60,70,80};
编译系统只对每个对象传递一个实参
Student stud[3] = { Student(1001,87,18),Student(1002,90,20),Student(1003,89,21)};
对象指针:对象空间的起始地址就是对象的指针
类名 *对象指针名;
指向对象成员的指针:
数据类型名 *指针变量名;
指向对象成员函数的指针:
(1)函数参数的类型和参数个数(2)函数返回值的类型(3)所属的类
函数返回值类型 (类名::*指针变量名)(参数列表);
指针变量名 = &类名::成员函数名
this指针:
在每一个成员函数中都包含一个特殊的指针,这个指针的名字是固定的 称为this
this指针是隐式使用的 它是作为参数传递给成员函数的
常对象:
凡希望数据成员不被修改的对象,可以声明为常对象:
const className objectName [(实参表列)];
className const objectName [(实参表列)];
常对象不能掉用该对象的非const型的成员函数
void getTime() const; //声明函数为const
mutable int count; //可以修改count的值
常数据成员:只能通过构造函数的参数初始化表对常数据成员进行初始化。
常对象的数据成员都是常数据成员。
常成员函数,只能引用本类中的数据成员,而不能修改它们。
——————————————————————————————
数据成员 | 非const成员函数 | const成员函数
——————————————————————————————
非const数据成员 | 可以引用可改变 | 可以引用不可改变
——————————————————————————————
const数据成员 | 可引用不可改变 | 可以引用不可改变
——————————————————————————————
const对象数据成员| 不允许 | 可以引用不可改变
——————————————————————————————
指向对象的常指针:
类名 * const 指针变量名;
(指向对象的常指针变量的值不能改变 即始终指向同一个对象 但是可以修改其所指向对象的值)
指向常对象的指针变量:
const 类型名 * 指针变量名;
(1):如果一个变量已经声明为常变量 只能用指向常变量的指针指向它
(2):指向常变量的指针除了可以指向常变量外 还可以指向未被声明为const的变量 只是不能通过指针变量改变该变量的值
(3):如果函数的形参是指向非const型变量的指针 实参只能用指向非const变量的指针 而不能用指向const变量的指针
当希望在调用函数时对象的值不被修改 就应当把形参定义为指向常对象的指针变量 同时用对象的地址作为实参,如果要求带对象不仅在调用函数的过程中不被改变,而且要求它在程序执行过程中都不改变 则应该把它定义为const型
const小结:
———————————————————————————————————————————————
形式 │ 含义
———————————————————————————————————————————————
Time const t1; │ t1是常对象 其值在任何情况下都不能改变
———————————————————————————————————————————————
void Time::fun() const │ fun是Time类中的常成员函数 可以引用 但不能修改本类中的数据成员
———————————————————————————————————————————————
Time * const p; │ p是指向对象的常指针,p的值(即p的指向)不能改变
———————————————————————————————————————————————
const Time *p; │ p是指向Time类常对象的指针,其指向的类对象的值不能通过指针来修改
———————————————————————————————————————————————
Time &t1 = t1; │t2是Time类对象t1的引用,二者指向同一段内存空间
——————————————————————————————————————————————————
对象的动态建立与释放
可以用new动态建立对象 用delete删除
Box *pt;
pt = new Box;
OR:
Box *pt = new Box(12,15,18);
cout<<pt->height;
cout<<pt->vloume();
delete pt;
对象的赋值和复制:
已经多'='进行了重载 所以两个对象之间(同类对象)可以直接进行赋值(对象里面成员数据的值)
对象名1 = 对象名2;
对象的复制:
ClassName objectName2(objectName2);
调用复制构造函数
静态数据成员
class ClassName
{
public:
static int tempExample;
private:
int xx;
};
int ClassName::tempExample = 10;
静态成员函数
静态成员函数没有this指针 如果要引用非静态成员变量 当需指明对象
用类名来引用静态成员的时候用::
C++
友元
友元函数可以访问一个类的私有成员 只需在类中声明一下
friend functionReturnType FunctionName(……);
friend functionReturnType ClassName::FunctionName(……);
类的提前引用 提前声明:
class ClassName;
一个函数(包括普通函数和成员函数)可以被多个类声明为朋友,这样就可以访问对各类中的私有数据
友元类
friend ClassName;
关系单向 不能传递
类模板:
类模板是类的抽象 类是类模板的实例
template<class numType>
ClassName <int> objectName(1,1);
在类外定义成员函数:
template<class typeName>
typeName ClassName<typeName>::functionName(……){……}
template<class 虚拟类型函数>
定义对象:
类模板名<实际类型名> 对象名;
类模板名<实际类型名> 对象名(实参表列);
定义函数:
template<class 虚拟类型参数>
functionReturnType ClassName<虚拟参数类型>::成员函数名(函数形参表列){……}
*/