c++ overview

36
C++ Overview C++ Overview 潘潘潘 潘潘潘 [email protected] [email protected] http://www.icst.pku.edu.cn/ http://www.icst.pku.edu.cn/ CompCourse/ CompCourse/

Upload: roxy

Post on 18-Jan-2016

73 views

Category:

Documents


2 download

DESCRIPTION

C++ Overview. 潘爱民 [email protected] 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++ 语言的基础知识. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: C++ Overview

C++ OverviewC++ Overview

潘爱民潘爱民

[email protected]@icst.pku.edu.cn

http://www.icst.pku.edu.cn/http://www.icst.pku.edu.cn/CompCourse/CompCourse/

Page 2: C++ Overview

内容简介内容简介

C++C++ 语言基础语言基础 Object-Based ProgrammingObject-Based Programming Object-Oriented Object-Oriented

ProgrammingProgramming STLSTL

Page 3: C++ Overview

C++C++ 之我见之我见

C++C++ 语言在变化,我们的概语言在变化,我们的概念也要调整变化念也要调整变化

最能反映最能反映 OOOO 思想的语言,思想的语言,掌握掌握 C++C++ 有助于理解有助于理解 OOOO

区分区分 CC 和和 C++C++ ,, C++C++ 不是不是CC 语言,不要用看待语言,不要用看待 CC 语言的语言的方式来看待方式来看待 C++C++

Page 4: C++ Overview

掌握掌握 C++C++ 语言的基础知识语言的基础知识 操作系统的基础知识操作系统的基础知识

– 文件文件 APIAPI 、、内存管理… 内存管理… infrastructuresinfrastructures

计算机原理计算机原理– 汇编语言汇编语言– C/C++C/C++ 是产生是产生 ASMASM 代码的代码的 frameworkframework

编译和执行过程编译和执行过程– 编译过程编译过程– 执行过程执行过程

许多概念许多概念– 进程、进程、 heapheap 、、 stackstack ,, ......

Page 5: C++ Overview

程程序序开开发发过过程程

开发

编辑

编译

出错?

链接

执行

结果正确? 结束

源程序file.cpp

目标程序file.obj

库函数和其它 OBJ

可执行程序 file.exe

Yes

YesNo

No

Page 6: C++ Overview

BuildBuild 过程:过程: compile compile timetime

Compile + linkCompile + link 如何对待错误和警告如何对待错误和警告

– 错误:一定要排除,从第一个错误找起错误:一定要排除,从第一个错误找起– 警告:或者排除,或者确实理解不会对程警告:或者排除,或者确实理解不会对程

序造成危害序造成危害 学会设置学会设置 compile optionscompile options 和和 link link

optionsoptions– IDEIDE 中如何设置? —— 一定要知道!中如何设置? —— 一定要知道!– 命令行如何设置?命令行如何设置?– 程序代码中如何设置?程序代码中如何设置?

Page 7: C++ Overview

执行过程:执行过程: runtimeruntime

LoadLoad 、、重定位、初始化、重定位、初始化、 mainmain 如何调试如何调试

– 断点断点– assertionassertion

程序对环境的依赖性程序对环境的依赖性– 系统环境系统环境– CRTCRT– 内存影像内存影像

Page 8: C++ Overview

C++C++ 语言内容语言内容 数据类型数据类型

– 内置内置 ((built-in)built-in) 、标准库、自定义的、标准库、自定义的 表达式表达式 控制语句控制语句 函数函数 (( 模板模板 )) 异常处理异常处理

Page 9: C++ Overview

函数模板函数模板

例子:例子:template <class Type>template <class Type>

Type min(Type a, Type b)Type min(Type a, Type b)

{{

return a<b?a:b;return a<b?a:b;

}}

min(10,20);min(10,20);

min(10.0, 20.0);min(10.0, 20.0);

模板实例化 ——由参数决定模板实例化 ——由参数决定– 隐式实例化隐式实例化– 显式实例化显式实例化– min<int>(10,20);min<int>(10,20);

Page 10: C++ Overview

函数模板函数模板(( 续续 ))

两种编译模式:两种编译模式:– inclusioninclusion 模式模式– separationseparation 模式模式 ((exportexport 关键关键

字字 ))

模板特化模板特化

重载函数模板重载函数模板

Page 11: C++ Overview

异常处理异常处理 ((exception exception handling)handling)

错误处理机制、错误代码隔离错误处理机制、错误代码隔离 Throw(raiseThrow(raise) ) an exceptionan exception

– Throw expressionThrow expression– 类似于类似于 return return 语句语句

TryTry 、、 catchcatch 语句语句 ((handler)handler)– try{}try{}– catch(catch(typetype){} ){} 或 或 catch(catch(type objtype obj){}){}

类似于函数调用类似于函数调用– 但是类型匹配发生在但是类型匹配发生在 runtimeruntime

Page 12: C++ Overview

异常处理异常处理 (( 续续 )) 嵌套机制,如果最外层没有处理,则由嵌套机制,如果最外层没有处理,则由

terminateterminate 来处理来处理 Local objectLocal object 正常析构正常析构 rethrowrethrow

– 在在 catchcatch 子句中仍然可以子句中仍然可以 throwthrow Catch all handlerCatch all handler

– catch(…)catch(…) 声明函数时指定函数可能的异常声明函数时指定函数可能的异常

– int func(int) throw(string);int func(int) throw(string);– 如果没有指定的异常发生,调用如果没有指定的异常发生,调用

unexpected()unexpected()

Page 13: C++ Overview

Object-Based Object-Based ProgrammingProgramming

classclass 实现数据封装实现数据封装 对象对象 构造函数与析构函数构造函数与析构函数 访问控制、友元访问控制、友元 嵌套类嵌套类 类中成员初始化类中成员初始化 虚拟函数虚拟函数 类中运算符重载类中运算符重载 类模板类模板

Page 14: C++ Overview

thisthis 指针指针

在类的内部指向类自身的指在类的内部指向类自身的指针针

在每个成员函数中,在每个成员函数中, thisthis 指指针提供了使用上的方便针提供了使用上的方便

thisthis 指针把类的多个实例对指针把类的多个实例对象区分开来象区分开来

Page 15: C++ Overview

模板模板

函数模板函数模板 即以数据类型为“参数”的函数即以数据类型为“参数”的函数

例如:例如: template < class T > Swap(template < class T > Swap(

T &a, T&b)T &a, T&b)

{{

T temp;T temp;

temp = a;temp = a;

a = b;a = b;

b = temp;b = temp;

}}

类模板类模板 (( 模板类或类生成器模板类或类生成器 )) 即以数据类型为“参数”的类即以数据类型为“参数”的类 例如:例如: template < class T > class Stacktemplate < class T > class Stack

{{

private :private :

T pool[maxNum];T pool[maxNum];

int sp;int sp;

public:public:

Stack();Stack();

void Push(T x);void Push(T x);

T Pop();T Pop();

BOOL IsEmpty() const;BOOL IsEmpty() const;

BOOL IsFull() const;BOOL IsFull() const;

};};

使用:使用: Stack < int > intStack;Stack < int > intStack;

Stack < float > float Stack;Stack < float > float Stack;

Page 16: C++ Overview

模板模板 (( 续续 )) 定义模板定义模板 实例化实例化 模板参数:类型参数、非类型参数模板参数:类型参数、非类型参数 两种编译模式:两种编译模式:

– inclusioninclusion 模式模式– separationseparation 模式模式 ((exportexport 关键字关键字 ))

类模板特化类模板特化 ((class template class template specializations)specializations)

类模板部分特化类模板部分特化 ((class template class template partial specializations)partial specializations)

Page 17: C++ Overview

从面向过程转换到面向对象从面向过程转换到面向对象

面向过程以功能为组织单元面向过程以功能为组织单元

在在 CC 语言中以函数作为功能单元;语言中以函数作为功能单元; 通过数据结构来描述具体的问题;通过数据结构来描述具体的问题; 数据在功能数据在功能 (( 函数函数 )) 之间以参数的形式被传送。之间以参数的形式被传送。

面向对象面向对象 用类用类 classclass 封装数据以及与数据相关的操作;封装数据以及与数据相关的操作; 用类的继承性来实现类的重用性;用类的继承性来实现类的重用性; 多态性。多态性。

Page 18: C++ Overview

Object-Oriented Object-Oriented ProgrammingProgramming

CShapeCShape CPointCPoint CLineCLine CCircleCCircle CArcCArc CTextCText

CShape

CPoint CLine CCircle CArc CText

Page 19: C++ Overview

多态性和虚拟函数多态性和虚拟函数 多态性是面向对象的一个支柱多态性是面向对象的一个支柱 允许程序在实施对象的操作时,允许对象按不允许程序在实施对象的操作时,允许对象按不同的方式完成不同类型对象的操作;不同类同的方式完成不同类型对象的操作;不同类型对象有自己实现操作的方法。型对象有自己实现操作的方法。

虚拟函数虚拟函数虚拟函数实现了多态性。虚拟函数实现了多态性。说明:在函数说明之前加上关键字说明:在函数说明之前加上关键字 virtualvirtual

在基类的说明中,定义虚拟函数:在基类的说明中,定义虚拟函数:virtual void Display();virtual void Display();

调用:调用:CShape *pShape = CShape *pShape =

GetCurrentShape();GetCurrentShape();

pShape->Display();pShape->Display();

Page 20: C++ Overview

对象的内存分布图对象的内存分布图

VptrVptr 指针和指针和 vtabvtab 表表

class A {class A {

private :private :

int value;int value;

public:public:

virtual void Func1(void)virtual void Func1(void)

virtual void Func2(void)virtual void Func2(void)

};};

变量 偏移量

vptr 0

value 4

A::Func1A::Func2

vtab

Page 21: C++ Overview

对象的内存分布图对象的内存分布图 (( 续一续一 ))

class B : pulic A {class B : pulic A {

private :private :

int value1;int value1;

public:public:

virtual void Func1(void)virtual void Func1(void)

virtual void Func2(void)virtual void Func2(void)

};};

变量 偏移量

vptr 0

value 4

value1 8

B::Func1B::Func2

vtab

Page 22: C++ Overview

对象的内存分布图对象的内存分布图 (( 续二续二 ))

class B : pulic A {class B : pulic A {

private :private :

int value1;int value1;

public:public:

virtual void Func1(void)virtual void Func1(void)

};};

变量 偏移量

vptr 0

value 4

value1 8

B::Func1A::Func2

vtab

Page 23: C++ Overview

继承关系继承关系 PublicPublic 继承继承

– ““ is-a”is-a” 关系关系 privateprivate 继承继承

– ““ has-a”has-a” 关系关系– 可以用复合类或者嵌套类来表示可以用复合类或者嵌套类来表示

protectedprotected 继承继承– 比比 privateprivate 继承放宽限制继承放宽限制

virtualvirtual 继承继承– 单个共享实例单个共享实例– 虚基类的构造由虚基类的构造由 the most derived the most derived

classclass 完成完成

Page 24: C++ Overview

类型转换类型转换 Static_castStatic_cast Dynamic_castDynamic_cast

– 向下转换向下转换void Draw(CShape *shape)void Draw(CShape *shape)

{{

//shape->DrawRect()//shape->DrawRect()

//shape->DrawCircle()//shape->DrawCircle()

if (dynamic_cast<CRect *>(shape)) {…}if (dynamic_cast<CRect *>(shape)) {…}

}}

RTTIRTTI :: typeidtypeid

Page 25: C++ Overview

Static_castStatic_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 ...}

Page 26: C++ Overview

Static_castStatic_cast 类型转换类型转换(( 续续 ))class B { ... };class D : public B { ... };

void f(B* pb){ D* pd1 = dynamic_cast<D*>(pb); D* pd2 = static_cast<D*>(pb);}

Page 27: C++ Overview

C++C++ 标准库标准库 CC 标准库标准库

iostream libraryiostream library– cincin 、、 coutcout 、、 cerrcerr– ostream& operator <<(ostream& ostream& operator <<(ostream&

os, const MyClass)os, const MyClass)– istream& operator >>(istream& istream& operator >>(istream&

os, MyClass&)os, MyClass&)

STL(Standard Template Library)STL(Standard Template Library)

Page 28: C++ Overview

Generic Generic ProgrammingProgramming

作者: Alexander Stepanov 目标:高效、灵活地实现各种算法目标:高效、灵活地实现各种算法 思想:对算法进行抽象,与数据表示思想:对算法进行抽象,与数据表示

分开分开 以模板技术为基础以模板技术为基础

– 函数模板函数模板– 类模板类模板

C++C++ 的发展使得这种思想得以实现的发展使得这种思想得以实现

Page 29: C++ Overview

STLSTL 基础基础 Object-Based ProgrammingObject-Based Programming

– 有关有关 classclass 的各种设计技术的各种设计技术

函数对象函数对象 ((function objects)function objects)– 重载了函数调用操作符重载了函数调用操作符 ()() 的类的类

模板模板– 函数模板函数模板– 类模板类模板– 模板特化模板特化

Page 30: C++ Overview

STLSTL 思想思想

数据类型

算法 容器

Page 31: C++ Overview

STLSTL 实现实现

Iterator

对象

容器 (Container)

算法 (Algorithm)

Iterator

对象

Iterator

对象

Page 32: C++ Overview

STLSTL 容器容器顺序容器顺序容器 ((Sequence Container)Sequence Container)

– vectorvector– dequedeque– listlist

关联容器关联容器 ((Associative Container)Associative Container)– setset– multisetmultiset– mapmap– multisetmultiset

Page 33: C++ Overview

STLSTL 迭代器迭代器

迭代器 (Iterator) 是指针 (pointer) 的泛化

任意访问 双向迭代器 向前迭代器

输入迭代器

输出迭代器

Page 34: C++ Overview

STLSTL 算法算法

改变顺序的操作– reverse 、 replace

不改变顺序的操作– for_each 、 find

排序及相关操作– sort 、 rotate

常用的数字操作– count 、 sum_up

Page 35: C++ Overview

使用使用 STLSTL

##include <functional>include <functional>

##include <list>include <list>

##include <iostream>include <iostream>

##include <algorithm>include <algorithm>

using namespace std;using namespace std;

template <typename T>template <typename T>

void print_elements(T elem)void print_elements(T elem)

{ { cout << elem << " "; }cout << elem << " "; }

void (*pfi)(int) = print_elements; void (*pfi)(int) = print_elements;

void main()void main()

{{

int ia[7] = {0,1,2,3,4,5,6};int ia[7] = {0,1,2,3,4,5,6};

list<int> ilist(ia, ia+7); list<int> ilist(ia, ia+7);

// // 以陣列做為 以陣列做為 list list 的初值的初值for_each(ilist.begin(), ilist.end(), pfi); for_each(ilist.begin(), ilist.end(), pfi);

// 0 1 2 3 4 5 6// 0 1 2 3 4 5 6

ilist.push_back(7);ilist.push_back(7);

ilist.push_back(0);ilist.push_back(0);

ilist.push_back(7);ilist.push_back(7);

ilist.push_back(9);ilist.push_back(9);

for_each(ilist.begin(), ilist.end(), pfi); for_each(ilist.begin(), ilist.end(), pfi);

// 0 1 2 3 4 5 6 7 0 7 9// 0 1 2 3 4 5 6 7 0 7 9

ilist.remove_if(bind2nd(modulus<int>(), ilist.remove_if(bind2nd(modulus<int>(), 2)); 2));

// // 去除所有奇數去除所有奇數for_each(ilist.begin(), ilist.end(), pfi); for_each(ilist.begin(), ilist.end(), pfi);

// 0 2 4 6 0// 0 2 4 6 0

}}

Page 36: C++ Overview

C++C++ 参考书参考书““C++ Programming Language”C++ Programming Language”

““ C++ Primer”(3/e)C++ Primer”(3/e)

““ Design and Evolution of C++”Design and Evolution of C++”

““Inside the C++ Object Model”Inside the C++ Object Model”

““Effective C++”(2/e)Effective C++”(2/e)

““More Effective C++”More Effective C++”

““Exceptional C++”Exceptional C++”

““C++ Strategies and Tactics”C++ Strategies and Tactics”

““Generic Programming and the STL”Generic Programming and the STL”

…………