GeeKBand&C++面向对象高级编程(上)第一周笔记
学习目标:
养成正规、大气的编程习惯,以良好的方式编写C++ class(class without pointer members、class with pointer members),掌握class之间的3种关系(继承、复合、委托)。
C++ programs 代码基本形式
c++ programs 代码基本形式延伸文件名(extension file name)不一定是.h 或.cpp,也可能是.hpp或其他或甚至无延伸名。
头文件(Header)中防御式声明(guard)
comple's guard防御式声明帮助我们不必关注包含头文件的次序,防止了重复声明、定义和编译。
一般在头文件中包括前置声明(forward declarations),类-声明(class declarations)和类-定义(class definition)。
Header(头文件)布局先写类声明中的head/body,再去补前置声明。
类模板:template声明接下来定义的class为class template,可以在使用时再定义里边的变量类型
在class head上面加上template<typename T>
inline标识符:
一个函数如果在class内部完成定义,那他就已经是inline函数,默认含有inline标识符函数若在class body内定义完成自动成为inline候选人。
函数以inline书写只是建议编译器以inline方式编译,但编译器到底有没有编译inline函数,我们不知道。
访问级别(access level)
public(function 外部调用) 可任意被外部访问
private(data) 只可被友元函数(由friend标识符提示)和同类对象访问
protect可被友元函数(由friend标识符提示)和同类对象访问,且可被子类访问。
不一定集中书写同一访问级别的信息,可以分开声明并书写,不声明且没有访问域信息时默认为private
外部不能直接访问class的private数据,数据一定要通过函数访问和修改——封装
构造函数ctor(constructor):负责对象的初始化,当一个对象被类创建时,自动被调用,不能直接调用构造函数。构造函数可以重载(overloading),多种初值设定。
构造函数名称与类名称一致,可以有参数,参数可以有默认值(default argument),没有返回值类型(return type)。
初值列(initialization list)(构造函数特有,功能可由写在函数体内的赋值语句代替,但是初值列更优) 格式”:数据名(参数名)“。
const标识符
在参数表后的const,表示当前函数不会改变对象内部成员变量的值。在参数前的const,表示当前参数对于成员函数是一个常量变量,且不会被改变。
值传递(pass by value)和引用传递(pass by reference (to const))
尽量不使用值传递的传递方案,因为整包传递,复制效率太低,当一些对象数据量比较大时,会给内存带来负担。在传参时,建议所有参数传递都传引用(效率),但注意这会修改原数据,若避免原数据被改变,在引用前添加const声明。
返回值传递
仍然推荐采用引用传递,但存储结果为栈空间的局部变量时,引用传递无意义,只能值传递。如返回的结果为const,只能采用值传递或const引用传递。使用引用传递时,传递者无需知道接收者是否以reference形式接受。
特殊的函数重载——操作符重载(operator overloading)
操作符重载可以视为函数的一种,注意操作符函数具有左右参数在函数中的映射关系。
临时对象(temp object)
在函数调用的时候,无论是参数为对象还是返回一个对象,都将产生一个临时对象。