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电影院人数统计
都是实战 欢迎私聊要代码
本文来自博客园,作者:软工菜鸡,转载请注明原文链接:https://www.cnblogs.com/SElearner/p/17676733.html

三次拷贝构造函数







浙公网安备 33010602011771号