抽象的概念
抽象是相对的不是绝对的
时钟的类 数据抽象 行为抽象
8.1-3访问控制
8.1.4-1类的实现与使用
类内部实现类
类外实现
类外实现
使用时钟类
例子如下
都输出10 所以会改变
注意!
两种都错误 因为他俩都是私有属性 ,只要是私有属性 数据成员和函数成员都不能在类的外面 看到或访问 只有在类的函数里面 才能内部访问
8.1.4-2类的实现与引用例子 例子:简单int数组类
在类public中添加函数 setArray 否则data没有初始化分配空间
getval取极值由参数condition=1or0决定
8.1.5指针
this指向对应的类对象的首地址
this指针举例
void setValue(int value) 此函数作用是用形参value设置setvalue初始化成员value 但是由于形参value同名的形参覆盖了成员数据value 形参value自己赋值给自己 所以成员数据value并没有修改为了用形参改变类对象的value 用this->value
②用不会覆盖value的形参v改变value的值也可以
this指针不能显示声明,它只是非静态成员函数的一个形参 右边是编译器的处理 把隐式this翻译
在main中 编译器把类对象的首地址作为参数调用 就像上图的右边
8.2初始化与结束处理 8.2-1构造函数 自动初始化
Counter counter2=9 这种方式只能对付 函数定义 只要求一个参数 的情况
Clock clock2();是错误初始化 因为定义要求 三个参数
上图这个类不能再有一个没有任何参数的构造函数(Clock() )了
因为第一个(int h=0....)他可以接受不带参数的构造函数 所以不能再定义否则会出现混淆重复
编译器自动生成的构造函数不做任何事 函数体是空的
8.2.2析构函数
两次输出对应Clock obj1 obj2
为了释放obj 加析构函数
8.2.3拷贝构造函数 用已经存在的构造函数初始化命名的构造函数
Point obj2(obj1) Point obj3=obj2 是一样的 调用拷贝构造函数
编译器自动产生的缺省拷贝构造函数
修改方案:让obj1obj2两个类对象的buf指针各自指向各自,都指向独立空间 释放的时候释放的是自己所指向的空间 就能解决这个问题
buf=new char[len] 指针new 然后strcpy buf 实现 准确复制数据
三次拷贝构造函数
8.3指针,参数,静态,常,友元与组合等概念 8.3.1类类型作为函数参数对象本身做参数 效率低 多次引用拷贝构造函数
对象引用 效率很高 直接用对象
对象指针 做参数 直接访问修改实参 但func3空间的分配和释放 效率不如上图
8.3.2对象数组 (一个类 存储多个类对象的数据)
这三行初始化分别对应array【3】数组里面的三个数据(point(3,4));(5);()
p++自动访问下一个类对象元素 方便快捷
8.3.3静态成员内部声明;类的外部定义并初始化
静态数据成员的特性(属于类,不属于类对象):无论调用多少次 静态数据成员在类的所有对象都共享同一片存储空间 例子:int s_value 是所有类对象共享的同一片空间
静态数据成员 属于类,不属于类对象
一个类对象修改了静态数据成员 所有的类对象访问的都是修改后的
静态成员函数的定义 在函数前加static
能将构造函数声明为非public属性 应用举例: 保证只有一个类的实例
没有实例的时候 instance=NULL
① 根据类对象是否合格 进行统计;设定类有一个整形计数器,类对象合格计数器加一,不合格不加;
②和③ 属于“类”问题 定义两个静态数据成员 分别计算工厂自生产以来 不合格产品数量 ,以及生产的时钟数量
①和对象相关定义为 普通成员;②③和类相关,和对象没有直接关系 定义为静态成员
8.3.4常对象与常成员(const)shoutime()是非常成员函数
3.常成员函数:这个成员函数
不能通过常成员函数 更新对象的数据成员 也不能调用 没有被const的成员是不能被调用的
定义的时候有const 实现的时候也要有
8.3.5友元
解决方案3:像第一种方案一个普通的成员函数实现两点距离&同时方便的访问到私有成员
关键字 friend 声明朋友后 Distence这个函数就可以访问所有Point类对象的私有共有成员 所有成员
Y的类对象都可以访问x的所有成员
Y的成员函数可以使用X X&obj
因为X只声明了Y::SetX 函数是X的友元 所以这个函数可以随便访问X类对象的私有数据
8.3.6组合类 类的组合Point圆心 是circle园这个类的部分 所以把point作为circle的子类 实数radius 半径作为数据成员
注意如果子类的构造函数没有不带缺省参数的;
就要用初始化列表的方式初始化子类对象 : circle(floatx,float y,float z):center(x,y)就是
调用的时候就先初始化子类对象,再调用组合类构造函数 先把各个部分完成 在组装成完整对象



