C++第八章 类与对象(基本概念)类的实现与使用 析构函数 构造函数 深浅拷贝 8.3指针,参数,静态,常,友元与组合等概念 加号运算符重载

抽象的概念

抽象是相对的不是绝对的

时钟的类 数据抽象 行为抽象

 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)就是

调用的时候就先初始化子类对象,再调用组合类构造函数 先把各个部分完成 在组装成完整对象 


加号运算符重载


p24 40 类和对象-C++运算符重载-左移运算符
到p28暂时跳过
https://www.bilibili.com/video/BV1et411b73Z?share_source=copy_pc

第八章 类与对象 编程实战与实验!!!

8-1 读程序,写结果

8-2 改错

①   类定义本身有问题 对私有数据初始化 通过构造函数进行初始化 ;不能像普通变量一样 定义变量同时用初始化链表初始化int a(0),b(0) <-错的;初始化链表可以但一定要通过构造函数 ;             第二点 x有两个参数,y有一个参数  也就是说 希望A的构造函数的参数 可以有缺省参数0;                  修改类的定义 私有数据int a,b 构造函数aa,bb,有缺省值=0;     类对象x,y  y的值是(a=4.b=0)        

 ②

对静态数据 必须在类的外部进行初始化和定义  int Test::x=20;  而int x=20是全局变量x

③A1的私有对象x,y不能在类的外部被访问到   最简单的解决 是把私有改成共有;但是不太好对 面向对象 来说;         或增加两个共有成员函数 分别获取x=A1.x,y=A1.y;但是代码量大


const int f5()const{return 5;}   ()后的const表示常函数f5 前面的const表示返回的是常数据5;

构造函数和析构函数都一定没有函数返回值 应该改为 ConstFun(){}


8-3 三角形类

8-4 简单时钟

8-5-1 行走的简单时钟

8-5-2 行走的简单时钟

8-6 图形时钟

8-7-1 多形状时钟

8-7-2 多形状时钟

8-7-3 多形状时钟

8-8电影院人数统计

都是实战 欢迎私聊要代码

posted @ 2022-06-24 17:25  软工菜鸡  阅读(19)  评论(0)    收藏  举报  来源