本帖为浙大翁恺教授c++课程的部分听课摘要。
-
第一个C++程序
c 语言 #include 〈 .h〉 而 c++无.h,文件名是不一定要有后缀的。- std :standard标准空间,c++标准类库里面的类属于某个命名空间,所以把using namespace std;写在程序前面,省去了后文需要写全类的全称(如std::string)。
- build:编译。
-
面向对象基本原理
- 从对象出发考虑问题,程序中设置的变量就是对象。
- 对象=属性➕服务(或数据➕操作)。
- 类是概念,对象是实体,类定义对象(属性),对象是一个类的东西。
- OOP特点:分装➕继承➕多态性。
-
自动售票机例子
- 每一个定义的类都要有两个文件。
- .cpp
- 函数的定义(代码的body)。
- .h(头文件)
- 类的声明declaration、所有函数的原型prototypes。.h放声明不放定义,是为了避免多个.cpp去include .h的时候,link遇到了重复定义的东西。
- 标准头文件结构:.h文件加这些是为了避免一个.cpp文件同时include 一个.h多次,而出现该.h类的声明重复出现。
- .cpp
- 每一个定义的类都要有两个文件。
::域的解析符。
-
头文件
- .h和.cpp文件成对出现,定义类的.cpp文件和任何使用这个类的函数都要include .h文件(#include编译预处理命令,并不是狭义编译器要做的事情,是广义的编译要做的〈编译预处理.ii、编译.s [编译的时候只针对一个.cpp文件 故无法知道是否多个文件内部有冲突]、汇编.o、链接.out〉,include把所有.h里的文件的文本放入.cpp文件,形成大文本提供给编译器编译)。
- 哪些是声明?
- extern变量
- 函数原型
- 类/结构声明
- #include
- "xx.h"在当前目录下寻找。
- 〈xx.h〉或〈xx〉在系统目录下找。
-
不同的变量
- 成员变量(field,字段),值和函数无关,在整个类的函数里都可以直接使用。生存周期是对象存在的时间。成员变量在类的每一个对象里。
- 本地变量(局部变量),值和函数有关,只能在函数内部定义,在函数内使用。参数=本地变量,但是存储位置不一样。
-
所有的成员函数都有隐藏变量:this(c++的关键字)
-
构造函数与析构函数
- 构造函数
- 名字和类的名字相同
- 无任何返回类型
- 在对象被创建时自动被调用
- 可以有参数
- 没有参数的构造函数叫default constructor
- 析构函数
- 命名~class(tilde)
- 作用:在对象生命周期结束后,释放内存空间
- 不能有参数
- 构造函数
-
对象初始化
- 编译器在进大括号(scope)时就分配了所有存储空间,但构造函数在对象定义时才调用。
-
访问限制(只在编译时刻)
- privite私有的
- 只有这个类的成员函数可以访问。
- 是对类来说的,同一个类的对象之间可以互相访问私有变量。
- public公开的
- protected受保护的
- 只有这个类自己和他的子子孙孙(继承)可以访问,外界无法访问。
- friend
- 一旦声明别人是你的朋友,他就可以访问你的privite。
- 可以是某个类/函数/某个类的某个函数。
- (运算符的重载常用到friend)
- class和struct在c++都是用来表达类的,有细微的差别:class默认访问属性privite,默认访问属性public。
- privite私有的
-
初始化列表
- 是在构造函数给成员变量赋值
- 早于构造函数实行
- 在构造函数的{}外面加:p(),如A( ):ax(100),ay(50) { ...}
- 建议使用初始化列表在构造函数初始化所有成员变量
-
对象组合(一种软件重用的方式)
- 用已有的对象组合成一个新的对象
- inclusion的方式
- fully:成员变量是对象本身,应该在初始化列表里调用该对象构造函数。
- by reference :成员变量是对象的指针。
-
继承(软件重用的方式)
- 在已有的类上做改造,构造一个新的类,可避免代码复制。
- class relationship
- Bass Class(基类)与Derived Class(派生类)
- Super与Sub
- parent与child
- 子类(superset),子类比父类有更多的功能/数据。
- 继承有关的访问界限。
-
- 建议在初始化列表中初始化所有父类的成员变量
- 父类先被构造,子类先被析构
- 名字隐藏:如果父类中有overloading的函数,在子类中也出现了重复的函数(名字、参数一样),那