Table Of Content课程简介
C++编程(1) (cid:134) 参考资料:
C++程序设计语言(特别版) 裘宗燕(北京大学)译
Bjarne Stroupstrup 机械工业出版社
ISBN 7-111-10202-9/TP.2424
唐晓晟 85RMB
C++ Primer, Lippman
北京邮电大学电信工程学院
(cid:134) 课时:34学时(17周)
(cid:134) 教学网站:
http://202.112.10.142/
http://teach.academy.net.cn/
BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn
第一章 导论(致读者) 1 书本结构
(cid:134) 书本结构 (cid:134) 导论:1-3章,有关C++语言,所支持的关
(cid:134) 学习C++ 键性程序设计风格,有关C++标准库的综
述
(cid:134) C++的设计
(cid:134) 第一部分:4-9章,C++内部类型
(cid:134) 历史注记
(cid:134) 第二部分:10-15章,使用C++做面向对
(cid:134) C++的使用
象和通用型程序设计
(cid:134) C和C++
(cid:134) 第三部分:16-22章,C++标准库
(cid:134) 忠告
(cid:134) 第四部分:23-25章,设计和软件开发
BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn
1
2 学习C++ 3 C++的设计
(cid:134) 最重要的事情:关注概念,不要迷失在语言 (cid:134) 重要设计原则:简单性,与C的高度兼容
的技术细节中 (cid:134) 无内部高级数据类型,没有高级的基本操作
(cid:134) C++支持多种不同的程序设计风格 (cid:134) 尽力避免了那些即使不用也会带来运行时间
(cid:134) C++支持一种逐步推进的学习方式 或者空间开销的特征
(cid:134) 直接学习C++,而不是先学习C (cid:134) 能够使用传统的编译和运行时的环境
(cid:134) 大量查阅资料,每一种至少参考两个来源 (cid:134) C++的类型检查和数据隐藏特征依赖于编
译时对程序的分析,以防止因为意外而破坏
数据的情况
BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn
(1) 效率和结构 (2) 哲学注记
(cid:134) C++以C为基础开发设计,大量维持了C作 (cid:134) 程序设计语言要服务于两个相互关联的目的
为一个子集,C++可以使用与C一样的函数
(cid:134) 1 为程序员提供一种描述所需执行的动作的
调用及返回序列-或者其他效率更高的方
载体,这要求一种“尽可能接近机器的”语言
式,而C的一个初始目标则是在大部分苛刻
的系统程序设计中代替汇编 (cid:134) 2 为程序员提供一组概念,使他们能利用这
(cid:134) C++中特别强调程序的结构,这反映了C以 些概念去思考什么东西是能够做的,这要求
来程序规模增长的情况 该语言“尽可能接近需要解决的问题”
(cid:134) 本书强调的是为提供通用功能、普遍有用的 (cid:134) C++的类概念已经被证明是一种极为强有
类型、库等的各种技术 力的概念工具
BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn
2
4 历史注记
(cid:134) C++大大受惠于C[Kernighan,1978] (cid:134) 异常处理机制部分受到
(cid:134) 其前驱为BCPL[Richards,1980](//注释) Ada[Ichbiah,1979]、Clu[Liskov,1979]
(cid:134) 一些灵感来自Simula67[Dahl,1970,1972] 和ML[Wikstrom,1987]语言的影响
(如类的概念、派生和虚函数) (cid:134) C++语言从1980年开始被研究组织使用,
(cid:134) Algol68[Woodward,1974],如重载运算 研究组织之外的最初使用起于1983年
符和自由的将声明放置在可以出现语句的任
(cid:134) C++读做C plus plus
何位置
(cid:134) 名称意义:C+,C++,++C,D
(cid:134) 模板机制功能部分受到Ada中generic的启
发,部分受到Clu语言参数模块的影响 (cid:134) C++设计的主要用途是为了个人程序员
BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn
5 C++的使用
(cid:134) 87年,爆炸性使用导致了标准化工作的开始 (cid:134) C++被应用到几乎每个领域
(cid:134) AT&T的贝尔实验室允许作者将C++参考手册的草 (cid:134) 高效率使得C++被用来写操作系统或者驱
稿和各种修订版本进行分发和共享
动程序
(cid:134) ANSI的X3J16委员会1989年12月在HP的建议下
(cid:134) 可靠性、可管理、易扩充、易测试使得
建立起来
C++被用于银行、贸易、保险、通信以及
(cid:134) 1991年该ANSI C++标准化变成ISO的C++标准
军事领域
化工作的一部分
(cid:134) 标准化草案1995年4月给公众阅览,ISO C++标 (cid:134) 由于编写用户界面,C++也被用于很多数
准1998年最终被批准(ISO/IEC 14882) 值的、科学的以及工程计算中去
BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn
3
C++被广泛应用于教学与研究 6 C和C++
(cid:134) 对于教授基本概念而言足够清晰 (cid:134) C被选做C++的基础语言的原因
(cid:134) 对于深刻的项目而言足够现实、高效和灵活 (cid:132) 通用的、简洁的、相对低级的
(cid:134) 对依赖各种不同开发和执行环境的组织或者 (cid:132) 适合用于大部分系统的程序设计工作
研究机构而言,使用起来足够方便 (cid:132) 可以在每个地方的任何系统运行
(cid:132) 适应于UNIX程序设计环境
(cid:134) 对作为教高级概念和技术的媒介而言,足够
的容易理解
(cid:134) 对作为从学习到非学习使用的工具而言,足
够商业化
BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn
C++继续与C兼容的原因 (1) 给C程序员的建议
(cid:134) 存在着成百万行的C代码可能从C++中获益,先决 (cid:134) C++里几乎不需要宏(const,enum定义明
条件是不必将他们用C++重写
显的常量, inline避免函数调用开销,
(cid:134) 存在着成百万行的用C写出的库函数和功能软件代
template刻画一组函数或类型, 用
码可以从C++里使用,先决条件是C++能够与C
连接兼容,语法相似 namespace避免名字冲突)
(cid:134) 存在着数以十万计的程序员先了解C,这样他们能 (cid:134) 使用变量时可以随时声明
够很快速的学会C++
(cid:134) 不要用malloc(new或者vector)
(cid:134) C++和C将在很多年中被同一些人用于同样的系
统,因此其差异必须或者很小、或者很大,以最大 (cid:134) 避免使用void*,指针算术,联合和强制
限度地减少错误和混乱的发生
(cid:134) 少用数组和C风格的字符串(string, vector)
BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn
4
(2) 给C++程序员的建议 7 忠告
(cid:134) C++在不断发展中,应该注意引进新的特 (cid:134) 编程是在为某个问题的解决方案中的思想建立起一
种具体表示
征,很多以前看来是全新的程序设计技术现
(cid:132) 如果能将“它”看成一个独立的概念,将其作成一个类
在已经变成可行的东西了 (cid:132) 如果能将“它”看成一个独立的实体,将它作成某个类的一
个对象
(cid:134) 不断的学习(作者本身在写这本书的过程中 (cid:132) 如果两个类有共同的界面,将此界面做成一个抽象类
就学到了不少东西) (cid:132) 如果两个类的实现有某些显著的共同东西,将这些共性
做成一个基类
(cid:132) 如果一个类是一种对象的容器,将它做成一个模板
(cid:132) 如果一个函数实现对某容器的一个算法,将它实现为对
一族容器可用的模板函数
(cid:132) 如果一组类、模板等相互之间有逻辑关系,将它们放进
一个名字空间去
BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn
(cid:134) 在定义一个并不是实现某个像矩阵或复数这
样的数学对象的类时,或者定义一个低层的
类型如链表时:
(cid:132) 不要使用全局数据(使用成员)
(cid:132) 不要使用全局函数
(cid:132) 不要使用公用数据成员
(cid:132) 不要使用友元
(cid:132) 不要在一个类里面放“类型域”:采用虚函数
(cid:132) 不要使用内联函数,除非有效果显著的优化
BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn
5
第四章 类型和声明
C++编程(2) (cid:134)类型 (cid:134)void
(cid:134)布尔量 (cid:134)枚举
(cid:134)字符类型 (cid:134)声明
唐晓晟
(cid:134)整数类型 (cid:134)忠告
北京邮电大学电信工程学院
(cid:134)浮点类型 (cid:134)练习
(cid:134)大小
BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn
4.1 类型 4.2 布尔量(bool)
void f(int a, int b)
(cid:134) C++中,每个名字都有一个与之相关联的 (cid:134) 布尔量bool,可以具有两 {
类型,类型决定了可以对其进行什么样的操 个值false或者true之一, b//o o…l bl = a == b;
作,并决定这些操作如何解释 用于表示逻辑运算的结 }
果。
(cid:134) 基本类型有: bool b = 7;
(cid:134) 根据定义 true = 1,
(cid:134) 布尔、字符、整数、浮点、枚举、void、指 false = 0,实际:非0即 int i = true;
针、数组、引用、数据结构和类 true void g()
{
(cid:134) 可以分为内部类型和用户自定义类型 (cid:134) bool变量和整数(包括指 bool a = true;
bool b = true;
针)可以相互转换
bool x = a + b;
bool y = a | b;
}
BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn
1
4.3 字符类型 以下假设都是不安全的
(cid:134) 类型为char的变量可以保存具体实现所用的 (cid:134) 8位字符集中共有不超过127个字符(有的字
字符集里面的一个字符 符集提供了255个字符)
(cid:134) 常用字符类型都至少包括8bit,可以保存 (cid:134) 不存在超出英语的字符(大部分欧洲语言提
供了更多的字符)
256种不同的数值
(cid:134) 字母字符是连续排列的(EBCDIC在”i”和”j”
(cid:134) 字符集一般都采用ISO-646的某个变形,比
之间留有空隙)
如说ASCII(ANSI3.4-1968)
(cid:134) 写C++所需要的每个字符都是可用的(有些
国家的字符集中没有提供{}[]\,C++提供
的解决方法有关键字、二联符和三联符)
BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn
解决受限的字符集 digraph and trigraph Examples
使用C的trigraph
关键字(keywords) 二联符(digraph) 三联符(trigraph)
#include <stdio.h>
C++ C++ C void main(intargc, char *argv??(??))
and && <% { ??= # ??<
if (argc>1 && argv??(0??) != NULL)
and_eq &= %> } ??( [ printf("Hello, %s!??/n",argv??(1??));
bitand & <: [ ??< { else printf("Hello, world!??/n");
bitor | 使用C++的digraph return 0;
compl ~ :> ] ??/ \ #include <stdio.h> ??>
not ! %: # ??) ] main(intargc, char *argv<::>)
or || %:%: ## ??> } <%
if (argc> 1 and argv<:0:> != NULL)
or_eq |=
??’ ^ printf("Hello, %s!??/n",argv<:1:>);
xor ^ else
??! |
xor_eq ^= printf("Hello, world!??/n");
not_eq != ??- ~ return 0;
%>
BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn
2
转义字符 字符类型
名字 ASCII名字 C++名字 (cid:134) char, signed char, unsigned char
换行符 NL(LF) \n (cid:134) char和int之间的相互转换(由实现决定)
水平制表符 HT \t
垂直制表符 VT \v (cid:134) wchar_t类型,用于保存更大的字符集里的
退格符 BS \b 字符,如Unicode,具体大小由实现决定,
回车符 CR \r 该名字来源于C语言,是一个typedef
换页符 FF \f
警铃符 BEL \a (cid:134) 对于字符类型可以进行算术和逻辑运算
反斜线符 \ \\ (cid:134) 字符文字量(字符常量),如’a’,’0’,’\n’等
问号 ? \?
单引号 ‘ \’ (cid:134) 宽字符文字量形式为L’ab’,引号中的字符个
双引号 “ \” 数由wchar_t决定,其类型是wchar_t
八进制 ooo \ooo
BBeeiijjiinngg UUnniivveerrss十iittyy六 ooff进 PPoo制ssttss && TTeelleeccoommmmhuuhnniihccaattiioonnss \ xyyhoouuhnnhgg@@bbuuppttnneett..eedduu..ccnn BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn
字符类型示例 字符类型程序示例
八进制 十六进制 十进制 ASCII 大字符集 char c = 255; // 0xff
\6 \x6 6 ACK \uXXXX或者\UXXXX int i = c;
\60 \x30 48 ‘0’ \u1e2b 问题:i = ? // 不同的环境下数值不同
\137 \x05f 95 ‘_’ \uXXXX等价于\U0000XXXX 解决方法:使用unsigned char 或者signed char标明
但是有些函数只接受普通char类型
void f(charc, signed char sc, unsigned char uc)
char v1[] = “a\xah\129”;
{
char v2[] = “a\xah\127”; char* pc = &uc;
signed char* psc= pc;
char v3[] = “a\xad\127”; unsigned char* puc= pc;
psc= puc;
char v4[] = “a\xad\0127”;
// 以上四条语句均产生错误
}
BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn
3
4.4 整数类型 4.5 浮点类型
(cid:134) 三种形式:int, signed int (signed) , (cid:134) 表示浮点数,即包括小数部分的数
unsigned int (unsigned)
(cid:134) 三种大小:float, double, long double
(cid:134) 三种大小:short int (short), int, long
(cid:134) 浮点文字量:1.23 .23 0.23 1. 1.2e10
int (long)
(cid:134) 与char不同,默认的int 总是有符号的 (cid:134) 注意:浮点文字量的中间不能出现空格
(cid:134) 整数文字量:7, 1234, 1234567890000 (cid:134) 以F(大小写)结尾表示float,不加后缀缺省
表示为double类型,若需要long double类
(cid:134) 十六进制:0x3f 八进制:022
型的数字,可以加上L(大小写)后缀
(cid:134) L(大小写)结尾表示long,U(大小写)结尾表
示unsigned,如:100UL
BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn
4.6 大小 大小
(cid:134) C++基本类型的某些方面是由实现确定 C++对象大小由char的大小的倍数表示,定义char的大
的,比如说int 小为1,
(cid:134) 为了保证程序的移植性,建议在所有的可能 则其他数据类型大小可以用sizeof运算符获得
之处都使用标准库的功能 1=sizeof(char)<=sizeof(short)<=sizeof(int)<=siz
eof(long)
(cid:134) 提供多种整数类型、无符号类型、浮点类型 1 <= sizeof(bool) <= sizeof(long)
的原因是希望使程序员能够利用各种硬件特 sizeof(char) <= sizeof(wchar_t) <= sizeof(long)
性。比方说:不同的硬件对不同的基础类型 sizeof(float) <= sizeof(double) <= sizeof(long
处理时,存储的需求、存储访问时间和计算 double)
速度方面存在明显的差异。 sizeof(N) = sizeof(signedN) = sizeof(unsignedN)
BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn
4
numeric_limits 4.7 void
#include <limits> (cid:134) void类型是一个语法上的基本类型
#include <iostream>
(cid:134) void可以用来标明一个函数并不返回数值,
using namespace std;
int main() 这可以理解为一个“伪返回类型”,可以加强
{ 语法的规范性
cout << "largest float == " <<
numeric_limits <float> :: max() (cid:134) 也可以用做指向不明类型的对象的指针的基
<< ", char is signed == " << 础类型
例如:
numeric_limits<char> :: is_signed
void x;// error
<< endl;
void f();
}
void* pv;
BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn
4.8 枚举 枚举类型的取值范围
(cid:134) 枚举是一种类型,可以保存一组由用户刻画 (cid:134) 如果某个枚举中的所有枚举符的值均非负,
的值,一旦定义,使用起来很像整数类型 该枚举的表示范围就是”0”到”2的k次幂-
(cid:134) 例如: 1”,k是能够使得所有枚举符号都在此范围
内的最小的2的幂
(cid:134) enum{ ASM, AUTO, BREAK };
(cid:134) 如果存在负的枚举符号值,该枚举的取值范
(cid:132) 定义三个枚举型的整数常量并赋值,默认方式
下,数值从0开始 围就是”负2的k次幂”到”2的k次幂-1”之间
(cid:132) ASM = 0, AUTO = 1, BREAK = 2
enum e1 {dark, lignt}; // 0:1
(cid:132) 枚举也可命名,如enum keyword{ ASM, enum e2 {a = 3, b = 9}; // 0:15
AUTO, BREAK }; 这样产生一个新的数据类型 enum e3 {min = -10, max = 1000000}; //-1048576:1048576
keyword
BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn BBeeiijjiinngg UUnniivveerrssiittyy ooff PPoossttss && TTeelleeccoommmmuunniiccaattiioonnss yyoouunngg@@bbuuppttnneett..eedduu..ccnn
5