C++复习笔记(总结每一个小的知识点,经常更新)


类和对象的特性

1.对象

客观世界中任何一个事物都可以看成一个对象,任何一个对象都应该具有属性和行为。对象应能根据外界给的消息进行相应的操作,一个对象一般有一组属性和一组行为构成。

数据体现了前面提到的属性,函数是用来对数据进行操作的,以便实现某些功能。

2.封装与信息隐蔽
可以对一个对象进行封装处理,把它的一部分属性和属性对外界屏蔽,也就是说外界是看不到的,甚至不可知的。把对象的内部实现和外部行为分割开来。

3.抽象
抽象的作用是表示同一类事物的本质。类是对象的抽象,而对象则是类的特例,也可以说是类的具体表现形式。
4.继承和重用
继承可以在原来已经有的类的基础上加上自己想要的属性,增加了程序的复用性,节省了编程工作量,不仅可以利用自己过去做好的类,还可以使用别人使用的
类或者存在类库中的类
5.多态性
由继承而产生的相关的不同的类,其对象对同一消息会做出不同的响应。多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。

2.1.3 类和对象的作用

C++支持面向过程的程序设计,也支持基于对象和面向对象的程序设计
基于对象就是基于类
基于对象的程序是以类和对象为基础的,程序的操作是围绕对象进行的
一组数据和一组操作相对应的。因此人们摄像相关的数据和操作1放在一起,形成一个整体,与外界相对分隔,这就是面向对象的程序设计中的对象。
程序=算法+数据结构
对象=算法+数据结构
程序=(对象+对象+对象.....)+消息
程序=对象s+消息

消息的作用就是对对象的控制,程序设计的关键是设计好每一个对象,以及确定向这些对象发出的命令,以使个对象完成相应的操作。
2.1.4 面向对象的软件开发
1.面向对象分析
2.面向对象设计
3.面向对象编程
4.面向对象测试
5.面向对象维护
2.3.4 成员函数的存储方式
同一类的不同对象的数据成员的值一般是不相同的,而不同对象的函数的代码是相同的,不论调用哪一个对象的函数的代码,其实调用的都是同样内容的代码
函数的代码放在了共享区域,公共代码段,因此一个对象所占的空间大小值取决于该对象中数据成员所占的空间,而与成员函数无关
(1)不要将成员函数的存储方式和inline 函数混淆
(2)不论是否用 inline 声明,成员函数的代码都不占用对象的存储空间 ,inline 函数只影响程序的执行效率
2.4 对象成员的引用
通过对象名和成员运算符访问对象中的成员
通过指向对象的指针访问对象中的成员
通过对象的引用访问对象中的成员
2.5类的封装性和信息隐蔽

在类外虽然不允许直接访问私有数据成员,但可以通过共用成员函数来引用甚至修改私有数据成员
共用成员函数是用户使用类的共用接口
当接口与实现分离时,只要类的接口没有被改变,对私有实现的修改不会引起程序的其他部分的修改

怎样使用类和对象
3.1 利用构造函数和类对象进行初始化

在C++中不能对类的对象直接在类中进行初始化,所以只能通过构造函数进行初始化,构造函数是一种特殊的成员函数,不需要用户来调用它,而是在建立对象时自动调用,必须和类同名
构造函数没有返回值,它的作用只是对对象进行初始化
构造函数不能被用户显式地调用
如果用户没有定义构造函数,那么系统会自动生成,但是我们要知道系统生成的构造函数不执行初始化操作,所以,为了简化代码,我觉得最好是自己设计
构造函数
带参数的构造函数
如果想要对不同的参数赋初值,那就需要采用带参数的构造函数
构造函数名(类型1 形参1,类型2 形参2)通过用户给出的实参,传递给形参
3.1.4 用参数初始化表对数据成员初始化

 类名::构造函数名([参数表])[:成员初始化表]
{ [构造函数体]}
构造函数的重载
如果想要对不同个数的参数进行初始化,那就需要对构造函数进行重载
无参构造函数属于默认构造函数,一个类只能有一个默认构造函数
使用默认参数的构造函数
它提供了建立对象时的多种选择,它的作用相当于好几个重载的构造函数,在声明构造函数时指定默认值,而不能只在定义构造函数时指定默认值
如果构造函数的全部参数都指定了默认值,则在定义对象时可以给一个或几个实参,也可以不给出实参
析构函数
当对象的生命周期结束,会自动调用析构函数
(1)如果在函数中定义了一个对象,当这个对象被调用结束时,对象应该释放,在对象释放前自动调用析构函数
(2)静态局部对象在函数调用结束时对象并不释放,只有当main函数结束或调用exit函数结束程序时,才调用析构函数
(3)如果是全局对象,那就需要等到出了文件作用域再调用析构函数
(4)如果是new出来的一个对象,当用delete运算符释放该对象时,先调用该对象的析构函数
(5)析构函数的作用不是删除对象,而是在撤销对象占用的内存之前做一些清理工作,使这部分内存可以重新被新的对象使用
(6)析构函数不返回任何值,没有函数类型,也没有函数参数
(7)析构函数因为没有函数参数,因此也不能被重载
(8)一个类可以有多个构造函数,但是只能有一个析构函数
(9)如果用户没有定义析构函数,那么系统也会自动生成,但是并不会执行任何操作
(10)先构造的后析构,先析构的后构造
(11)两个对象的存储类别不同,生命周期不同,因此调用析构函数的顺序也可能不同,但是构造函数的调用一定是先定义先调用
3.4 对象数组

对象数组中的每一个元素都是同类的对象
编译系统只为每个对象元素的构造函数传递一个实参,所以在定义数组时提供的实参个数不能超过数组元素个数
可以像结构体一样对对象数组进行初始化,使用{}隔开
3.5 对象指针

一个对象存储空间的起始地址就是对象的指针,可以定义一个指针,用来存放对象的地址,这就是指向对象的指针变量
3.5.2指向对象成员的指针
对象有地址,那么对象的成员也就有地址,存放对象成员的地址的指针变量就是指向对象成员的指针变量
函数指针 void (*p)()
成员函数指针  void(Time::*p2)
p2 = &Time::get time()
只想当前对象的this 指针,它是指向本类的指针,它的值是当前被调用的成员函数所在的对象的起始地址
3.6 共用数据的保护

常对象
Time const t1(12,23,34);
在t1的生命周期中,对象t1中的数据成员的值都不能被修改
定义常成员之前必须同时对之初始化,之后不能被改变
(1)如果一个对象被声明为常对象,则通过该对象只能调用它的常成员函数
(2)常成员函数可以访问常对象中的数据成员,但不允许修改常对象中数据成员的值
(3)只能通过构造函数的参数初始化表对常数据成员进行初始化,任何其他函数都不能对常数据成员赋值
(4)如果将成员函数声明为常成员函数,则只能引用本类中的数据成员,而不能修改他们
 void get_time ()const;
(5)常成员函数可以引用const数据成员,也可以引用非const的数据成员
(6)常数据成员可以被常函数引用,也可以被非常函数引用
(7)如果已经定义了一个常对象,只能调用其中的常成员函数,而不能调用非常成员函数
(8)常成员函数不能调用非常成员函数
3.6.3 指向对象的常指针
 Time t1(12,12,13)
 Time *const ptr1;
 ptr1= &t1;
 指向对象的常指针变量的值是不能被修改的,始终只能指向一个对象,这点和引用是类似的。
3.6.4  指向常对象的指针变量
const char *ptr
const 类型名 *指针变量名
(1)如果一个变量已被声明为常变量,只能用指向常变量的指针变量指向它
(2)指向常变量的指针变量可以指向常变量也可以指向指向普通变量,但是此时就不能通过此指针变量改变该变量的值,这相当于权限缩小
(3)指向非const 变量的指针只能指向非const 变量
(4)指向常对象的指针最常用于函数的形参,目的是在保护形参指针所指向的对象,使它在函数执行过程中不被修改
(5)当希望在调用函数时对象的值不被修改,就应当把形参定义为指向常对象的指针变量,同时用对象的地址做实参。

                                                                                                                                                     
  • 12
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值