潘爱民 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/

Slides:



Advertisements
Similar presentations
第 2 章 初探 C++.
Advertisements

程序设计实习 3月份练习解答
Memory Pool ACM Yanqing Peng.
第九讲 类与对象 (I)面向对象基础.
程設一.
類別與物件 Class & Object.
第15章 繼承與多重繼承 15-1 繼承的基礎 15-2 覆寫與隱藏父類別的成員 15-3 子類別的建構與解構子 15-4 多重繼承
第八章 类和对象.
C++程序设计 王希 图书馆三楼办公室.
Using C++ The Weird Way Something about c++11 & OOP tricks
C# 程式設計 第一部分 第1-4章 C# 程式設計 - 南華大學資管系.
走向C++之路 WindyWinter WindyWinter感谢诸位前来捧场。
Chapter 1 用VC++撰寫程式 Text book: Ivor Horton.
Chap 18 類別與物件 夫有土者,有大物也。有大物者,不可以物。 物而不物,故能物物。 明乎物物者之非物也,豈獨治天下百姓而已哉!
4.1 概述 4.2 类与对象的实现 4.3 对象的初始化和析构 4.4 类的包含 4.5 类模板
Derived Class 前言 衍生類別的定義 單一繼承 public, protected, 和 privated 基底類別
Chap 3 堆疊與佇列 Stack and Queue.
面向对象技术 练习2 ffh.
Scope & Lifetime 前言 Local Scope Global Functions & Objects
Ch13 集合與泛型 物件導向程式設計(2).
刘胥影 东南大学计算机学院 面向对象程序设计1 2011~2012第3学期 刘胥影 东南大学计算机学院.
·线性表的定义及ADT ·线性表的顺序存储结构 ·线性表的链接存储结构 · 单向循环链表 · 双链表、双向循环链表 · 一元多项式的加法
刘胥影 东南大学计算机学院 面向对象程序设计1 2010~2011第3学期 刘胥影 东南大学计算机学院.
西安交通大学 计算机教学实验中心 大学C++程序设计教程 西安交通大学 计算机教学实验中心
导入 STL的概念与组成 Iterator(迭代器) Container(容器) Algorithm(算法) Adaptors(配接器)
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Object-Oriented Programming in C++ 第一章 C++的初步知识
第三章 C++中的C 面向对象程序设计(C++).
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
Lecture 1 STL Primer.
【STL標準樣版函式庫】 STL(Standard Template Library),即標準樣版函式庫,是一個具有工業標準、高效率的C++函式庫。它包含於C++標準函式庫(C++ Standard Library)中,是ANSI/ISO C++標準中,最新的、也是極具革命性的一部分。STL包含了諸多在電腦科學領域裏所常用的基本資料結構和基本演算法。為廣大C++程式師們提供了一個可擴展的應用框架,高度實現了軟體的可複用性。這種現象有些類似於Microsoft.
第1章 C++程序设计基础 网络游戏开发-C++程序设计.
谭浩强 编著 中国高等院校计算机基础教育课程体系规划教材 C++程序设计.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
第三章 链表 单链表 (Singly Linked List) 循环链表 (Circular List) 多项式及其相加
10 多載函數 10.1 多載概論 多載一般函數 多載成員函數 10-3
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
常宝宝 北京大学计算机科学与技术系 数据结构(三) 常宝宝 北京大学计算机科学与技术系
C++大学基础教程 第11章 多态性 北京科技大学 信息基础科学系 2019/4/8 北京科技大学.
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第四章 栈和队列 栈 ( Stack ) 队列 ( Queue ) 优先队列 (Priority Queue) 小结.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
物件導向程式設計 CH2.
第11章 從C到C++語言 11-1 C++語言的基礎 11-2 C++語言的資料型態與運算子 11-3 C++語言的輸出與輸入
C++语言程序设计教程 第2章 数据类型与表达式 第2章 数据类型与表达式 制作人:杨进才 沈显君.
Object-Oriented Programming in C++ 第二章 类和对象
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
C++程序设计 吉林大学计算机科学与技术(软件)学院.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
第 8 章 标准模板库STL 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
Java程序设计 第17章 异常和断言.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
C++语言程序设计 第十章 C++标准模板库 成都信息工程学院计算机系.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
本章主題 C++的程式結構 資料型態與宣告 算術運算 簡易的輸入輸出指令 程式編譯(Compile)的過程與原理.
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
C++程序设计 概述 潘荣江 山东大学软件学院.
面向对象程序设计 C++教程 西安工业大学 于帆.
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
C++语言程序设计(第4版) 第七章 继承与派生 数学与统计科学学院 胡凤珠.
C++程序语言设计 Chapter 14: Templates.
資料結構與C++程式設計進階 C++與資料結構 講師:林業峻 CSIE, NTU 7/ 5, 2010.
Presentation transcript:

潘爱民 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” ……