潘爱民 panaimin@icst.pku.edu.cn http://www.icst.pku.edu.cn/CompCourse/ C++ Overview 潘爱民 panaimin@icst.pku.edu.cn http://www.icst.pku.edu.cn/CompCourse/
内容简介 C++语言基础 Object-Based Programming Object-Oriented Programming STL
C++之我见 C++语言在变化,我们的概念也要调整变化 最能反映OO思想的语言,掌握C++有助于理解OO 区分C和C++,C++不是C语言,不要用看待C语言的方式来看待C++
掌握C++语言的基础知识 操作系统的基础知识 计算机原理 编译和执行过程 许多概念 文件API、内存管理… infrastructures 汇编语言 C/C++是产生ASM代码的framework 编译和执行过程 编译过程 执行过程 许多概念 进程、heap、stack,...
程序开发过程 开发 编辑 源程序 file.cpp 编译 Yes 目标程序 出错? file.obj No 链接 可执行程 序file.exe 链接 库函数和 其它OBJ 执行 No 结果正确? Yes 结束
Build过程:compile time Compile + link 如何对待错误和警告 错误:一定要排除,从第一个错误找起 警告:或者排除,或者确实理解不会对程序造成危害 学会设置compile options和link options IDE中如何设置? —— 一定要知道! 命令行如何设置? 程序代码中如何设置?
执行过程:runtime Load、重定位、初始化、main 如何调试 程序对环境的依赖性 断点 assertion 系统环境 CRT 内存影像
C++语言内容 数据类型 内置(built-in)、标准库、自定义的 表达式 控制语句 函数(模板) 异常处理
函数模板 例子: 模板实例化 ——由参数决定 template <class Type> Type min(Type a, Type b) { return a<b?a:b; } min(10,20); min(10.0, 20.0); 模板实例化 ——由参数决定 隐式实例化 显式实例化 min<int>(10,20); 函数模板
函数模板(续) 两种编译模式: inclusion模式 separation模式(export关键字) 模板特化 重载函数模板
异常处理(exception handling) 错误处理机制、错误代码隔离 Throw(raise) an exception Throw expression 类似于return 语句 Try、catch语句(handler) try{} catch(type){} 或 catch(type obj){} 类似于函数调用 但是类型匹配发生在runtime
异常处理(续) 嵌套机制,如果最外层没有处理,则由terminate来处理 Local object正常析构 rethrow 在catch子句中仍然可以throw Catch all handler catch(…) 声明函数时指定函数可能的异常 int func(int) throw(string); 如果没有指定的异常发生,调用unexpected()
Object-Based Programming class实现数据封装 对象 构造函数与析构函数 访问控制、友元 嵌套类 类中成员初始化 虚拟函数 类中运算符重载 类模板
this指针 在类的内部指向类自身的指针 在每个成员函数中,this指针提供了使用上的方便 this指针把类的多个实例对象区分开来
模板 类模板(模板类或类生成器) 函数模板 即以数据类型为“参数”的类 例如: template < class T > class Stack { private : T pool[maxNum]; int sp; public: Stack(); void Push(T x); T Pop(); BOOL IsEmpty() const; BOOL IsFull() const; }; 使用: Stack < int > intStack; Stack < float > float Stack; 模板 函数模板 即以数据类型为“参数”的函数 例如: template < class T > Swap( T &a, T&b) { T temp; temp = a; a = b; b = temp; }
模板(续) 定义模板 实例化 模板参数:类型参数、非类型参数 两种编译模式: inclusion模式 separation模式(export关键字) 类模板特化(class template specializations) 类模板部分特化(class template partial specializations)
从面向过程转换到面向对象 面向过程以功能为组织单元 面向对象 在C语言中以函数作为功能单元; 通过数据结构来描述具体的问题; 数据在功能(函数)之间以参数的形式被传送。 面向对象 用类class封装数据以及与数据相关的操作; 用类的继承性来实现类的重用性; 多态性。
Object-Oriented Programming CShape CPoint CLine CCircle CArc CText CShape CPoint CLine CCircle CArc CText
多态性和虚拟函数 多态性是面向对象的一个支柱 虚拟函数 允许程序在实施对象的操作时,允许对象按不同的方式完成不同类型对象的操作;不同类型对象有自己实现操作的方法。 虚拟函数 虚拟函数实现了多态性。 说明:在函数说明之前加上关键字virtual 在基类的说明中,定义虚拟函数: virtual void Display(); 调用: CShape *pShape = GetCurrentShape(); pShape->Display();
对象的内存分布图 Vptr指针和vtab表 class A { private : int value; public: virtual void Func1(void) virtual void Func2(void) }; 变量 偏移量 vptr 0 value 4 vtab A::Func1 A::Func2
对象的内存分布图(续一) class B : pulic A { private : int value1; public: virtual void Func1(void) virtual void Func2(void) }; 变量 偏移量 vptr 0 value 4 value1 8 vtab B::Func1 B::Func2
对象的内存分布图(续二) class B : pulic A { private : int value1; public: virtual void Func1(void) }; 变量 偏移量 vptr 0 value 4 value1 8 vtab B::Func1 A::Func2
继承关系 Public继承 private继承 protected继承 virtual继承 “is-a”关系 “has-a”关系 可以用复合类或者嵌套类来表示 protected继承 比private继承放宽限制 virtual继承 单个共享实例 虚基类的构造由the most derived class完成
类型转换 Static_cast Dynamic_cast RTTI:typeid 向下转换 void Draw(CShape *shape) { //shape->DrawRect() //shape->DrawCircle() if (dynamic_cast<CRect *>(shape)) {…} } RTTI:typeid
Static_cast类型转换 class B { ... }; class D : public B { ... }; void f(B* pb, D* pd) { D* pd2 = static_cast<D*>(pb); // not safe, pb may // point to just B B* pb2 = static_cast<B*>(pd); // safe conversion ... }
Static_cast类型转换(续) class B { ... }; class D : public B { ... }; void f(B* pb) { D* pd1 = dynamic_cast<D*>(pb); D* pd2 = static_cast<D*>(pb); }
C++标准库 C标准库 iostream library STL(Standard Template Library) cin、cout、cerr ostream& operator <<(ostream& os, const MyClass) istream& operator >>(istream& os, MyClass&) STL(Standard Template Library)
Generic Programming 作者:Alexander Stepanov 目标:高效、灵活地实现各种算法 思想:对算法进行抽象,与数据表示分开 以模板技术为基础 函数模板 类模板 C++的发展使得这种思想得以实现
STL基础 Object-Based Programming 函数对象(function objects) 模板 有关class的各种设计技术 函数对象(function objects) 重载了函数调用操作符()的类 模板 函数模板 类模板 模板特化
STL思想 数据类型 算法 容器
STL实现 Iterator 对象 容器(Container) 算法(Algorithm)
STL容器 关联容器(Associative Container) 顺序容器(Sequence Container) vector deque list 关联容器(Associative Container) set multiset map
STL迭代器 迭代器(Iterator)是指针(pointer)的泛化 输入迭代器 任意访问 双向迭代器 向前迭代器 输出迭代器
STL算法 改变顺序的操作 不改变顺序的操作 排序及相关操作 常用的数字操作 reverse、replace for_each、find sort、rotate 常用的数字操作 count、sum_up
使用STL void main() { int ia[7] = {0,1,2,3,4,5,6}; list<int> ilist(ia, ia+7); // 以陣列做為 list 的初值 for_each(ilist.begin(), ilist.end(), pfi); // 0 1 2 3 4 5 6 ilist.push_back(7); ilist.push_back(0); ilist.push_back(9); // 0 1 2 3 4 5 6 7 0 7 9 ilist.remove_if(bind2nd(modulus<int>(), 2)); // 去除所有奇數 // 0 2 4 6 0 } 使用STL #include <functional> #include <list> #include <iostream> #include <algorithm> using namespace std; template <typename T> void print_elements(T elem) { cout << elem << " "; } void (*pfi)(int) = print_elements;
C++参考书 “C++ Programming Language” “C++ Primer”(3/e) “Design and Evolution of C++” “Inside the C++ Object Model” “Effective C++”(2/e) “More Effective C++” “Exceptional C++” “C++ Strategies and Tactics” “Generic Programming and the STL” ……