由于这一学期刚开始介绍的预备知识(递归、结构体和枚举、string、指针与引用等)已经写在前面的博客里了。在这里我主要对类与对象以及运算符重载这两章谈谈感想、收获。
1.类与对象
-
类的数据成员也可以是其他类的对象(类的组合),但不能类自身的对象作为本类的成员,而类自身的指针和引用可以作为类的成员。
-
在类的定义中不能对数据类型进行初始化;类的任何成员都必须指定访问属性。
-
在类外:各成员函数的具体实现。
-
class中括号后的分号“;”不能省略。
-
public:成员函数(类外使用)
private:数据成员(类外不能使用,安全)。 -
类与结构体的区别:无明确指定时,c++结构体的成员是共有的,而类的成员是私有的。
-
成员函数操作的成员:
- 数据成员
- 函数内部定义的局部变量
- (全局变量,封闭性差)
-
访问成员函数:
对象名.共有成员
对象指针变量名->共有成员 -
this指针 指向当前对象
局部变量形参在函数体内,范围小的起作用,范围大的被屏蔽,即形参起作用。 -
函数重载:函数名相同,但参数不相同(类型不同或者个数不同)(功能类似)。
-
构造函数:
一定要重载。用于创建对象的特殊函数。创建对象自动调用。构造函数公有的。
作用:为对象分配空间;对数据成员赋初值;请求其他资源。
用户没定义的话,系统提供缺省版的构造函数。 -
析构函数:
用于取消对象的成员函数。
作用:
进行对象消亡的清理工作。
若用户没有定义,系统提供缺省版本。 -
构造函数的初始化列表:
funnname(参数列表){
//函数体,可以是空函数体
}
数据成员名(形参1)…成员名n(形参n)
必须使用:
1.数据成员为常量
2.数据成员为引用类型
3.数据成员为没有无参构造函数的类的对象
-
构造函数没有返回值,不能有参数,也不能重载。
-
浅拷贝:只复制了数据成员没有复制资源。
简单数据类型,没有问题。
复杂数据类型,公用形参的资源删掉,对象(作为形参时)出错。没有自身的存储位置,成员值只是一个地址,和复制的是一个人家删了,自己也删了,没有独立的空间。 -
常对象:针对类的实例化。
类名 const 对象名【(参数表)】或者
const 类名 对象名 【(参数表)】常对象只能调用它的常成员函数,静态成员函数,构造成员函数【具有公共访问权限】
-
常成员函数:函数说明后加const关键字(简称常函数)对成员函数只读不写
-
静态成员(类成员):所有对象公用一个副本
在定义完类后直接写(初始化)不初始化:默认为:
整数:0
字符:NULL -
友元:破坏类的封装性,不建议使用。
这个函数可以是不属于任何类的函数,也可以是其他类的成员函数。 -
类的包含(类的组合)
总结:
前面简单的梳理了一些基础知识点,当然我没有全部写上,只是写了我认为的比较重要的以及课本上没有的(老师讲的)一些知识点。每一个知识点都比较碎,需要理解并记忆。课本上的基础语法和老师讲的语法需要课后巩固。不足:我感觉目前对于浅拷贝、深拷贝等的应用不够深刻,还需要大量的阅读和实践。这一章是基础,后面还有继承、多态等,所以我要把这些不足之处补上,为后面的学习打下基础。
2.运算符重载
-
返回 对象类型/对象的引用
-
运算符函数是一种特殊的成员函数或友元函数。
-
一元运算符
二元运算符 -
用成员函数重载运算符:
返回类型 operate 运算符(形参表);//比正常少一个操作数
Time operate ++();//前置自增
Time operate ++(int);//后置自增 -
用友元函数重载运算符:
它的操作数一个不少,操作数类型不相同时,必须使用友元函数。(尽量不使用友元函数重载) -
&:形参,复杂类型
加&:引用
不加&:临时对象,易销毁。
返回值没加引用返回一个临时对象,只在函数内,返回后不用了;若加&,常有对象。 -
c++不能用友元函数重载的运算符:
- () [] -> -
重载赋值运算符:
只能用成员函数重载。
已知对象之间赋值,复制构造函数不起作用。 -
重载运算符[]和(),只能用成员函数重载,不能用友元函数重载。
-
重载流插入和流提取运算符
只能重载成友元函数
复杂类型,整体输入和输出
在重载输入、输出流时可以加入一些判断性的检测。总结:
对于运算符重载,使我感觉眼前一亮。原因就是可以是一些比较复杂符问题简单化,在使用起来非常方便,这是我在java中没有见到的。当然,这一节内容主要就是成员函数、友元函数对运算符重载。其内容主要有对赋值运算符、[]、()、<<、>>等等的重载。其细节也很重要,比如在赋值运算符重载时的深拷贝问题。这里我也只是简要梳理,细节内容我会仔细翻看思考。
经过这几周的学习,我对面向对象有了进一步的认识,无论是从语法问题还是从认识方面。初始化列表以及运算符重载使我感觉c++很优秀,面对一些问题是处理问题很方便,这是我第一个收获。第二个收获就是老师告诉我们的在写类的时候可以将其分为数据类和操作类,这样写比较好,重载运算符时可以把重载运算符函数写到数据类中。第三个收获是在调试的时候,每定义一个类/函数都要在主函数测试(全部功能都有测试),这样在以后写篇幅大的问题减少时间浪费,进而提高效率。