360 likes | 593 Views
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++ 语言的基础知识.
E N D
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 编译 目标程序 file.obj Yes 出错? 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 > Swap( T &a, T&b) { T temp; temp = a; a = b; b = temp; } 类模板(模板类或类生成器) 即以数据类型为“参数”的类 例如: 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; 模板
定义模板 实例化 模板参数:类型参数、非类型参数 两种编译模式: 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继承 “is-a”关系 private继承 “has-a”关系 可以用复合类或者嵌套类来表示 protected继承 比private继承放宽限制 virtual继承 单个共享实例 虚基类的构造由the most derived class完成 继承关系
Static_cast Dynamic_cast 向下转换 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标准库 iostream library cin、cout、cerr ostream& operator <<(ostream& os, const MyClass) istream& operator >>(istream& os, MyClass&) STL(Standard Template Library) C++标准库
作者:Alexander Stepanov 目标:高效、灵活地实现各种算法 思想:对算法进行抽象,与数据表示分开 以模板技术为基础 函数模板 类模板 C++的发展使得这种思想得以实现 Generic Programming
Object-Based Programming 有关class的各种设计技术 函数对象(function objects) 重载了函数调用操作符()的类 模板 函数模板 类模板 模板特化 STL基础
STL思想 数据类型 算法 容器
算法(Algorithm) Iterator Iterator Iterator 对象 对象 对象 容器(Container) STL实现
STL容器 • 顺序容器(Sequence Container) • vector • deque • list • 关联容器(Associative Container) • set • multiset • map • multiset
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(7); ilist.push_back(9); for_each(ilist.begin(), ilist.end(), pfi); // 0 1 2 3 4 5 6 7 0 7 9 ilist.remove_if(bind2nd(modulus<int>(), 2)); // 去除所有奇數 for_each(ilist.begin(), ilist.end(), pfi); // 0 2 4 6 0 } #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” ……