第一节
基础
知道变量、类型、作用域、循环、流程控制。
知道程序要经过编译、链接之后才能被执行。
知道如何编译和链接源代码。
什么是基于对象和面向对象?
对于单一class的设计就是基于对象(Object Based)的,当class之间具备某种关联的时候就是面向对象的,面向对象是针对多个class的,学习面向对象要从基于对象开始,先要能写出正确的单一class。
第二节
C vs. C++, 关于数据和函数的比较
C语言用函数处理数据,数据与函数是分开的,但是由于语言没有提供足够的关键字,所以c语言中一个数据要想被多个函数处理,就必须是全局的,大家都可以处理。C++面向对象提供class关键字将数据和处理这些数据的函数包裹在一起,有点类似于C中的结构,但是多了一些特性,提供了关键字让我们使用这些特性,C++也有结构,几乎等同于class,只有微小的差别。C++是以class为类型创建对象。
Class的经典分类:带指针,不带指针
典型代表:复数和字符串的实现
复数:没有指针
字符:其实是个指针,指向一串字符
复数问题:数据有很多份,函数只有一份,用一个函数处理很多数据,却又说将其包在一起,中间的桥梁是什么?
C++代码的基本形式:头文件,主程序,标准库(头文件)
输出比较:C++输出无需指明数据类型,C需要
头文件的防卫式声明:原因,其他或者你本人引用声明时,能够随时的去包含文件,而不用担心重复包含,或者包含的顺序,在头文件里面进行以下的防卫式声明:告诉编译器说,一进来如果不曾经定义过,就编译出来,然后直到结束,所以如果程序第一次include它,就,其就被定义好了,再include,该名词已被定义过了,就不会再进去了,所以就不会有重复的include动作。
#ifndef __complex__
#define __complex__
*******声明及定义
##endif
模板:将共同部分抽取出来
第三节
inline(内联):函數若在 class body 內定义完成,便自动成为 inline 候选人,而如果在body之外定义,要想成为inline函数,必须显示声明。成为inline这样会加快运行速度。但不是任何函数都可以inline,如果函数过于复杂,则无法成为内联函数。最终具体结果还是取决于编译器。
访问级别:public公开的,可以被外界看到,private,只能被我这个类看到,一般数据应该是private的,因为我们希望数据封装,不被外界看到,函数是public的,需要被外界使用,还有第三种protected。示例中,创建对象会调用构造函数,都打算打印出复数的实部和虚部,右边是通过对象的函数得到数据,这样可以,因为函数是public的,左边是直接取对象的数据,但是数据是private的,所以错误。
构造函数:创建一个对象的时候,构造函数自动被调用,构造函数可设置默认参数,并用冒号设置参数初始化列表。构造函数的写法很独特,其函数名一定要与类名相同。它可以拥有参数,和参数默认值,但并不是独有的特性,构造函数没有返回类型。只有构造函数才有初值列。放弃初值列,直接赋值,会降低效率。构造函数可以有很多个——overloading(重载)。当创建对象都没有值时,如果重载的函数也没有参数,从而导致编译器无法确定调用哪一个构造函数,产生冲突时,就不能重载。
不带指针的类多半不用析构函数。
特别情况:构造函数放在private内,不能创建对象,例如Singleton
第四节
常量成员函数
1)class有两种类型的函数,会改变数据的和不会改变数据的。不会改变对象数据的函数的会加上const。
2)不加的话,使用者在创建对象时,在对象变量前加了const,这样与函数处可以改变矛盾,编译会报错。
参数传递:pass by value vs. pass by reference(to const)
1)pass by value:传参数值,内存多大传多大。
2)pass by reference:传引用,相当于传指针那样快,传参数地址,有地址符号。
3)参数传递最好传引用。
4)如果不想所传参数被改变,加const。
返回值传递:return by value vs. return by reference(to const)
返回值传递也尽量传引用。
什么情况不能返回引用?
如示例返回结果放在已有的空间,就可以返回值传引用,若放在新创的空间,返回的就是新创建的,但它在函数结束后就消亡了,这时就不能传引用。函数操作结果是一个临时变量,就不要传引用。
友元friend
1)加了friend的函数,可以直接由取得friend的private成员,而不是通过函数取。
2)friend打开了封装的大门,不用friend,可以通过函数取,只是降低了速度。
3)相同的class各个对象互为友元。
定义类的注意事项
1)数据放在private里
2)参数,返回值尽量传引用
3)在类的body里,该加const就加
4)构造函数要用初始列
第五节
操作符重载之一,成员函数
所有的成员函数一定带有隐含的参数this,this是指针,this表示指向调用成员函数的对象,不在参数列写出来,但是可以直接使用
return by reference返回值引用语法分析
传递者无需知道接收者是以reference形式接收
+=操作符返回值类型不可以是void,反例是连续的+=赋值
class body之外的各种定义
操作符重载之二,非成员函数(无this)
临时对象 typename();
下面示例函数绝对不能return by reference,因为它们返回的必定是个local object
临时对象的生命到下一行就结束,且没有名字
第六节
复数编代码关键思路
1,首先,是防卫式声明
2,然后类头,body内
3,考虑复数的数据,以及数据类型
4,接着是函数部分,首先是构造函数
然后考虑构造函数的参数,参数的初始值,是否传引用然后是考虑初值列
5,然后考虑操作符函数声明,考虑是否设计为成员函数,传递值和返回值是否传引用,同时考虑是否加const
6,body外成员函数需要complex::,然后就是函数定义
7,不把+函数设计为成员函数而是全局函数的原因是因为该操作符涉及的不仅仅是复数还有实数