当前位置首页 > 人力资源/企业管理 > 人事管理
搜柄,搜必应! 快速导航 | 使用教程  [会员中心]

北邮c面向对象程序设计与实践02-C Foundations.pdf

文档格式:PDF| 46 页|大小 336.66KB|积分 5|2020-10-29 发布|文档ID:16825158
第1页
下载文档到电脑,查找使用更方便 还剩页未读,继续阅读>>
1 / 46
此文档下载收益归作者所有 下载文档
  • 版权提示
  • 文本预览
  • 常见问题
  • 1 1 1 1 C++ 语言基础 概述 2 2 2 内容 概述:C++ 与 C 的关系 基本数据类型 用户自定义数据类型 表达式 基本控制结构 函数2 3 3 3 C++ 与 C 的关系 C++ 源于 C 语言 C 语言是在 B 语言的基础上发展起来的 1960:ALGOL 60 1963:剑桥大学推出了CPL(Combined Programming Language) 语言,后来经简化为BCPL语言 1970:贝尔实验室的 K.Thompson以BCPL语言为基础,设计了一 种新语言,取其第一字母 B,称为 B 语言 1972:贝尔实验室的Dennis M.Ritchie为克服B语言的诸多不足,在B语言 的基础上重新设计了一种语言,取其第二字母C,称为 C 语言 C语言的特点是极高的代码效率,但: 不支持面向对象,不支持类与封装机制 难以支持代码重用 1980年,贝尔实验室的 Bjarne Stroustrup对 C 语言进行了扩充,提出了 “带类的C”,多次修改后起名为 C++,以后又经过不断的改进 C++改进了C的不足之处,支持面向对象的程序设计,在改进的同时保持 了C的简洁性和高效性。

    4 4 4 C++ 与 C 的关系 C++语言是在C语言的基础上进行了扩充和改进而得到的 它继承了 C 语言的全部内容 并在 C 语言的基础之上增加了面向对象编程的内容 C++既支持面向过程的程序设计,又支持新型的面向对象程序设计 C++保持了与C语言的兼容 大部分的 C 代码的程序不经修改,或很少修改就可被 C++ 使用 用 C 语言编写的许多库函数和应用软件也都可以用于 C++ C++不是一个纯粹的面向对象程序设计语言 C 语言是面向过程的语言,C++与C兼容,支持面向过程的程序设计 由于面向过程程序设计和面向对象程序设计是两种不同风格的程序设计 技术,对于习惯于面向过程程序设计的程序员在学习使用 C++ 时可能 存在一定的障碍3 5 5 5 C++ 对 C 的扩展 增加了一些在新的运算符,使得C++应用起来更加方便 new,delete用于内存管理,用户不需直接使用库函数 增加了引用 int i,j; float g,h; main() func(i,j); func(g,h); foo(100); void func(int a, int b) int i; float g; ... i = a+b; g = a-b; ... void func(int a, int b) ... // 执行语句 int i; i = a+b; ... // 其他执行语句 float g; g = a-b; ... for (int j=0;j<100;j++) ... 6 6 6 C++ 对 C 的扩展 与面向对象相关的功能: 类与对象:抽象、封装、继承与派生、多态性 异常处理 模板编程,提供标准模板库(STL) 容器、流式 IO、字符串、... #include #include main() char buf_11024; char buf_21024; printf(“Please input word 1:”); sscanf(buf_1,”%s”); printf(“Please input word 2:”); sscanf(buf_2,”%s”); strcat(buf_1,buf_2); printf(“%sn”,buf_1); #include #include using namespace std; main() string word_1, word_2; cout

    大小写的英文字母 AZ,az 数字字符 09 符号 ! # %.,( ) 其他符号 10 10 10 词法记号 关键字 C++预定义的单词 标识符 程序员声明的单词,它命名程序正文中的一些实体 文字 在程序中直接使用符号表示的数据 操作符 用于实现各种运算的符号: + - * / ... 分隔符 用于分隔各个词法记号或程序正文 空白符 空格 制表符 换行符 注释6 11 11 11 关键字 关键字是C++保留的,作为专用定义符的单词,在程 序中不允许另作它用 auto break case char class const continue default do default delete double else enum explicit extern false float for friend goto if inline int long mutable new operator private protected public register return short signed sizeof static static_cast struct switch this ture typedef union unsigned virtual void while 12 12 12 标识符 标识符是对实体定义的一种定义符 由字母或下划线开头、后面跟字母或数字或下划线组成的 字符序列 具有特定的有效长度 ANSI C 标准规定 31 个字符 用来标识用户定义的常量名、变量名、函数名、文件名、 数组名、和数据类型名和程序等。

    大写字母和小写字母代表不同的标识符7 13 13 13 文字常量 数字常量 1 100 200U 10000L 0 x100 3.14 1.25e+10 字符常量 a b abcd 字符串 字符串是由双引号括起来的字符串常量 “China”、“C++ Program” 14 14 14 分隔符与空白符 分隔符 用于分隔各个词法记号或程序正文 ( ) 和空白符 空白符 空格、换行、制表符 注释 是用来帮助阅读、理解及维护程序 注释部分被忽略,不产生目标代码 C++语言提供两种注释方式: 一种是与C兼容的多行注释,用 /* 和 */ 分界 另一种是单行注释,以“//”开头,表明本行中“//”符号后的内容 是注释8 15 15 15 C++ 简单实例 //2_1.cpp #include using namespace std; int main() cout<

    枚举类型的声明形式如下: enum 枚举类型名 变量值列表; 例如: enum weekday sun, mon, tue, wed, thu, fri, sat; 枚举元素具有缺省整型值,依次为: 0,1,2,...... 可以在声明时另行指定枚举元素的值,如: enum weekday sun=7, mon=1, tue, wed, thu, fri, sat; //声明sun为7,mon为1,以后顺序加1,sat为610 19 19 19 枚举类型enum 枚举类型应用说明: 对枚举元素按常量处理,不能对它们赋值例如,不能写: sun = 0; 整数值不能直接赋给枚举变量,如需要将整数赋值给枚举 变量,应进行强制类型转换 枚举值可以进行运算 weekday day; day = mon; // right day = 2; // error day = (weekday)2; // right int d = day; // d = 2 d = d + fri; // d = 2+5 if (d thu) ... 20 20 20 数据类型 用户定义数据类型/抽象数据类型(UDT/ADT) 使用 struct / class 定义 struct Sample_Struct int iCount; char * pName; sample; class CComputer private: char * m_pComputerName; ... public: void PowerOn(); void Startup(); ... ;11 21 21 21 结构的声明 结构的概念 结构是由不同数据类型的数据组成的集合体。

    声明结构类型 struct 结构名 数据类型 成员名 1; 数据类型 成员名 2; : : 数据类型 成员名 n; ; 成员引用: 结构变量名.成员名 结构指针-成员名 22 22 22 结构 举例: struct student //学生信息结构体 int num; //学号 char name20; //姓名 ... ; student Mary, Bob; // 结构变量 Mary、Bob 结构变量的存储类型概念、它的寿命、可见性及使用范围 与普通变量完全一致 结构变量说明在结构类型声明之后,二者也可同时进行 结构变量占内存大小可用 sizeof()求出12 23 23 23 联合 联合的成员共享相同的地址空间 声明形式: union 联合名 数据类型 成员名 1; 数据类型 成员名 2; : 数据类型 成员名 n; ; 联合体类型变量说明的语法形式 联合名 联合变量名; 引用形式: 联合变量.成员名 联合指针-成员名 24 24 24 例: union uarea char c_data; short s_data; long l_data; uarea c_data l_data s_data 联合13 25 25 25 匿名联合 没有标记联合的名字,只是声明一个成员项的集合,这些 成员项具有相同的内存地址,可以由成员项的名字直接进 行访问。

    例: union int i; float f; // 在程序中可以这样使用: i=10; f=2.2; 匿名联合通常作为结构的内嵌成员 26 26 26 typedef 语句 用于将一个标识符声明成某个数据类型的别 名,然后将这个标识符当作数据类型使用 语法形式 typedef 已有类型名 新类型名表; 例如 typedef double area,volume; typedef int natural; natural i1,i2; area a; volume v;14 27 27 27 数据类型 数据类型 字符型数据 字符型数据 字符常量(整型常数的一种) 单引号括起来的字符 a 等同于 0 x61 ( a 的 ASCII 码值为97) D 等同于 0 x44 ( D 的 ASCII 码值为68) aD 等同于 0 x4461 int i= ABCD; 字符型(整型的一种,8bit) 用来存放字符常量, 例: char c1 = a; c2=A; 字符数据的使用方法 字符数据和整型数据之间可以运算 字符数据与整型数据可以互相赋值 a (0 x61) c1 c2 i=0 x44434241 D C B A A (0 x41) A (0 x41) B (0 x42) C (0 x43) D (0 x44) 28 28 28 字符串常量 例: CHINA a a 所以: char c; c = a; char *p = CHINA; C H I N A 0 a0 a Page 28 数据类型 数据类型 字符串 字符串 C H I N A 0 p 是一个 地址指针15 29 29 29 数据类型 数据类型 布尔型 布尔型变量的说明: 例:bool flag; 布尔型数据占用一个字节,取值: 只有 false(0)和true(1)两个值 逻辑表达式的返回值类型 bool a = b bool 与整型相容,可以参与整数运算 flag = 0; // flag = 0; false flag = 5; // flag = 1; true int a = 3; a = a + flag; // a = 3+1 = 4 30 30 30 变量初始化 变量初始化 例: int a = 3; double f = 3.56; char c = a; int i(5); Page 3016 31 31 31 变量的存储类型 auto (变量的缺省类型) 临时存储变量,具有生命周期,生命期结束后存储空间可 以被其他自动变量覆盖使用 register 建议使用通用寄存器 extern 声明该变量的定义不一定在本源文件中 static 静态,在程序的整个生命周期(执行期间)有效 extern int e; void func(int a, int b) int i; auto int j; static int x; register int y; void func(int a, int b) int i; ... int i = 1; i++; ... 32 32 32 表达式(expressions ) 简单表达式 常量、变量、函数标识符自身构成一个表达式 1000 a func(100) 复杂表达式 由表达式与运算符(operator)按照语法规则构成的 a+1000 b*func(100)/1000 c = func(a+b) % 1000 表达式的类型必须与运算符类型匹配 float a; char * p; (a+p) // 非法,不支持浮点型与指针相加 表达式加上 ( ) 也是表达式,如 (a+b) 计算表达式时,首先计算 ( ) 内的表达式的值 每一个表达式都是有返回值的 表达式 c = func(a+b) % 1000 的返回值等于 c 赋值的结果17 33 33 33 表达式计算和类型转换 一些二元运算符(算术运算符、关系运算符、逻辑运算符、位 运算符和赋值运算符)要求两个操作数的类型一致。

    在算术运算和关系运算中,如果参与运算的操作数类型不一 致,编译系统会自动对数据进行转换(即隐含转换),基本原 则是将低类型数据转换为高类型数据 当参与运算的操作数必须是bool型时,如果操作数是其它类 型,编译系统会自动将非0数据转换为true,0转换为false 位运算的操作数必须是整数,当二元位运算的操作数是不同类 型的整数时,也会自动进行类型转换, 赋值运算要求左值与右值的类型相同,若类型不同,编译系统 会自动将右值转换为左值的类型 34 34 34 表达式计算和类型转换 表达式求值过程中,若操作数的数据类型不同,则将 自动向高级类型转换 char-short-int-long-float-double int a; char c; float f; double d; double result = (a + c) * f / d; c - int 结果 - float 结果 - double18 35 35 35 类型转换 类型转换 不同类型数据进行混合运算时,C++编译器会自动进 行类型转换 为了避免不同的数据类型在运算中出现类型问题, 应尽量使用同种类型数据 可以采用强制类型转换 36 36 36 强制类型转换 语法形式: 类型说明符(表达式) 或 (类型说明符)表达式 强制类型转换的作用是将表达式的结果类型转换为类 型说明符所指定的类型 float c; int a, b; c = float(a) / float(b); c = (float)a / (float)b; 19 37 37 37 运算符 CComputer::PowerOn() Comp.Mouse pComp-Mouse int array10 printf(%dn, a); CComputer Comp(10); a++ a-- typeid(Comp) 38 38 38 运算符 sizeof(CComputer) ++a --a a !a -a +a delete pComp; (unsigned)a Comp.*Startup() pComp-*Startup()20 39 39 39 运算符 40 40 40 算术表达式 算术表达式 基本算术运算符 + - * / (若整数相除,结果取整) %(取余,操作数为整数) 优先级与结合性 先乘除,后加减,同级自左至右 ++, --(自增、自减) 例:i++ -- j21 41 41 41 赋值表达式 赋值表达式 举例 n = n+5 表达式的类型:= 左边对象的类型 表达式的值: = 左边对象被赋值后的值 复合附值运算符: += -= *= /= %= <= if (a < 0) a = 0; for (int i=0; i<10; i++) a ++; a += i; if (a < 0) a = 0; 52 52 52 C++ C++ 语句 语句 声明语句:声明或定义变量、函数等 int a; extern void func(int x); 表达式语句: a = 100; 将多个语句用大括号包围,便构成一个复合语句: sum = sum + i; i ++; 27 53 53 53 顺序结构 分支结构 循环结构 算法的基本控制结构 54 54 54 if (表达式) 语句; if (xy) cout

    因此,每个 case 分支最后应该加break语句 每个常量表达式的值 不能相同,次序不影 响执行结果 可以是多个语句,可不 必用 可以是整型、字符型、枚举型 56 56 56 循环语句 while 形式 while (表达式) 语句 可以是复合语句 表达式 执行语句 Y N29 57 57 57 循环语句 循环语句 do do- -while while 形式 do 语句 while (表达式); 可以是复合语句 表达式 执行语句 N Y 58 58 58 循环语句 循环语句 for for 语法形式 for (表达式1;表达式2;表达式3) 语句 表达式2 计算 表达式1 N Y 执行语句 计算 表达式330 59 59 59 break break 和 和 continue continue 语句 语句 break 语句 使程序从循环体和switch语句内跳出,继续执行逻辑上的下一 条语句不宜用在别处 continue 语句 结束本次循环,接着判断是否执行下一次循环 60 60 60 函数31 61 61 61 函数的声明 函数声明的语法形式 类型标识符 函数名(形式参数表) 语句序列 是被初始化的内部 变量,寿命和可见 性仅限于函数内部 若无返回值,应写void 62 62 62 函数的声明 形式参数表 name 1 , name 2 , ..., name n 函数的返回值 由 return 语句给出,例如: return 0; 无返回值的函数(void类型),不必写return语句32 63 63 63 函数的调用 调用前必须先定义该函数,或声明函数原型: 函数原型说明: 类型标识符 被调用函数名(含类型说明的形参表); 例如: void func(int a, int b); float foo(float a); 调用形式 函数名(实参列表) 嵌套调用 函数可以嵌套调用,但不允许嵌套定义。

    递归调用 函数直接或间接调用自身 64 64 64 函数调用的执行过程 main() 调fun() 结束 fun() 返回 保存: 返回地址 当前现场 恢复: 主调程序现场 返回地址 33 65 65 65 嵌套调用 函数的声明与使用 main 调fun1() 结束 fun1() 调fun2() 返回 fun2() 返回 66 66 66 例: 求x 的n次方的函数 #include using namespace std; double power(double x, int n); // 函数原型 int main() double x; int n; cout < x; cout < n; cout << x << “(“ << n << “)=” << power(x,n) << endl; double power (double x, int n) if (n==1) return x; if (n==0) return 1; if (n<0) return 1/power(x, -n); // 递归调用 return power(x, n-1) * x; // 递归调用 34 67 67 67 函数的参数传递机制 在函数被调用时才分配形参的存储单元。

    实参可以是常量、变量或表达式 实参类型必须与形参相符 值传递时是传递参数值,即单向传递 68 68 68 函数的参数传递机制 X N 被调函数: 调用者: 3 2.5 A D = power(A,3) 2.5 3 double power(double X, int N)35 69 69 69 例:参数传递 #include using namespace std; void Swap(int a, int b); int main() int a(5), b(10); cout << “(a,b)=“ << a << “,” << b << endl; Swap(a,b); cout << “(a,b)=“ << a << “,” << b << endl; return 0; void Swap(int a, int b) int t; t=a; 输出结果: a=b; (a,b)=5,10 b=t; (a,b)=5,10 70 70 70 例:参数传递(使用指针) #include using namespace std; void Swap(int *a, int *b); int main() int a(5), b(10); cout << “(a,b)=“ << a << “,” << b << endl; Swap( cout << “(a,b)=“ << a << “,” << b << endl; return 0; void Swap(int *a, int *b) int t; t=*a; 输出结果: *a=*b; (a,b)=5,10 *b=t; (a,b)=10,5 36 71 71 71 数据类型:引用 引用( int //建立int型的引用ri,初始化为变量i的引用 j = 10; ri = j; //相当于 i=j; double f; double rf = 100.5; //相当于 f=100.5; 声明一个引用时,必须同时对它进行初始化,使它指向一 个已存在的变量(对象)。

    一旦一个引用被初始化后,就不能改为指向其它对象 引用可以作为函数的参数进行传递,也可以作为返回值 void swap(int void Swap(int int main() int a=5, b=10; cout << “(a,b)=“ << a << “,” << b << endl; Swap(a,b); cout << “(a,b)=“ << a << “,” << b << endl; return 0; void Swap(int t=i; 输出结果: i=j; (a,b)=5,10 j=t; (a,b)=10,5 37 73 73 73 内联函数 声明时使用关键字 inline 编译时在调用处用函数体进行替换,节省了参数传递、 控制转移等开销 内联函数的声明必须出现在内联函数第一次被调用之前 inline void Swap(int t=a; a=b; b=t; int main() int a(5), b(10); Swap(a,b); return 0; 74 74 74 默认参数 函数在声明时可以预先给出默认的形参值,调用时如给出实 参,则采用实参值,否则采用预先给出的默认形参值。

    例如: int add(int x=5, int y=6) return x+y; int main() add(10,20); // 10+20 add(10); // 10+6 add(); // 5+6 return 0; 38 75 75 75 默认参数 默认形参值必须从右向左顺序声明,并且在默认形 参值的右面不能有非默认形参值的参数因为调用 时实参取代形参是从左向右的顺序 例: int add(int x, int y=5, int z=6); //正确 int add(int x=1, int y=5, int z); //错误 int add(int x=1, int y, int z=6); //错误 76 76 76 默认参数 若调用出现在函数体实现之后,默认参数可在函数实现时给出 默认参数值也可以在函数原型中给出,但默认参数只能定义一次 int add(int x=5, int y=6); int main() add(10); // 10+6 add(); // 5+6 return 0; int add(int x, int y =6 ) return x+y; int add(int x, int y); void func() add(10); int add(int x=5, int y=6) return x+y; int add(int x, int y); void func() add(10,20); add(10); //不能使用默认参数 int add(int x=5, int y=6); int main() add(10); // 10+6 add(); // 5+6 return 0; int add(int x, int y) return x+y; 39 77 77 77 默认参数 在相同的作用域内,默认形参值的说明应保持唯一,但如 果在不同的作用域内,允许说明不同的默认形参。

    例: int add(int x=1,int y=2); int main() int add(int x=3,int y=4); add(); //使用局部默认形参值(实现3+4) retrun 0 void fun(void) ... add(); //使用全局默认形参值(实现1+2) 78 78 78 int x, y, z; float e, f; add(x,y); add(x,y,z); add(e,f); 函数重载(function overloading ) C++允许功能相近的函数在相同的作用域内以相同函数名声 明,从而形成重载 实际意义和功能相同或相近,方便使用,便于记忆 编译器自动根据参数类型、个数等调用相应的函数 形参类型不同 int add(int x, int y); float add(float x, float y); 形参个数不同 int add(int x, int y); int add(int x, int y, int z);40 79 79 79 函数重载 不要将不同功能的函数声明为重载函数,以免出现调用 结果的误解、混淆 int add(int x,int y); int add(int a,int b); 编译器不以形参名来区分重载 int add(int x,int y); void add(int x,int y); 编译器不以返回值来区分重载 重载函数的形参必须不同: 个数不同或类型不同。

    编译程序将根据实参和形参的类型及个数的最佳匹配来选择 调用哪一个函数 80 80 80 操作符的重载 在 C++ 中,操作符与函数一样,可以进行重载 type operator operator-symbol ( parameter-list ) #include using namespace std; struct complex double re; double im; ; // 实现复数 a+b complex operator +(complex a,complex b) complex result; result.re = a.re + b.re; result.im = a.im + b.im; return result; 41 81 81 81 输入/ 输出操作 向标准输出设备(显示器)输出 例: int x; cout << “x=“ < x; // 表达式语句 其中,cin、cout 是在 C++ 流式 IO 库中定义的 82 82 82 I/O 流的概念 当程序与外界环境进行信息交换时,存在着两个对 象,一个是程序中的对象,另一个是文件对象 流是一种抽象,它负责在数据的生产者和数据的消费 者之间建立联系,并管理数据的流动 程序建立一个流对象,并指定这个流对象与某个文件 对象建立连接,程序操作流对象,流对象通过文件系 统对所连接的文件对象产生作用 流对象是程序中的对象与文件对象进行交换的界面 读操作在流数据抽象中被称为(从流中)提取,写操 作被称为(向流中)插入42 83 83 83 输出流 重要的输出流类(C++标准库中预定义) ostream ofstream ostream最适合于顺序文本模式输出 预先定义了如下的输出流对象: cout标准输出 cerr 标准错误输出,没有缓冲,发送给它的内容立 即被输出。

    clog 类似于cerr,但是有缓冲,缓冲区满时被输出 84 84 84 插入运算符(<< ) 插入 (<<) 运算符对所有标准C++数据类型预 先进行了操作符的重载 用于将数据转换成输出字节串的形式,传送 到一个输出流对象43 85 85 85 控制输出格式 控制输出宽度 为了调整输出,可以通过在流中放入setw操纵符或调用 width成员函数为每个项指定输出宽度 例: 使用 width 控制输出宽度 #include using namesoace std; int main() double values = 1.23,35.36,653.7,4358.24; for (int i=0;i<4;i++) cout.width(10); cout << valuesi << endl; 输出结果: 1.23 35.36 653.7 4358.24 86 86 86 例:使用* 填充 #include using namespace std; int main() double values=1.23,35.36,653.7,4358.24; for(int i=0; i<4; i++) cout.width(10); cout.fill(*); cout << valuesi << endl; 输出结果: ******1.23 *****35.36 *****653.7 ***4358.2444 87 87 87 例:使用setw 指定宽度 #include #include using namespace std; int main() double values=1.23,35.36,653.7,4358.24; char *names=Zoot,Jimmy,Al,Stan; for (int i=0;i<4;i++) cout << setw(6) << namesi; cout << setw(10) << valuesi << endl; 输出结果: Zoot 1.23 Jimmy 35.36 Al 653.7 Stan 4358.24 88 88 88 ofstream ofstream 类支持磁盘文件输出 若需要一个只输出的磁盘文件,可以构造一个 ofstream类的对象 如果在构造函数中指定文件名和模式,当构造这个文 件时该文件是自动打开的 ofstream myFile(filename,iosmode); 可以在调用默认构造函数之后使用open成员函数打开 文件 ofstream myFile; //声明一个静态输出文件流对象 myFile.open(filename,iosmode); //打开文件,使流对象与文件建立联系45 89 89 89 ofstream 成员函数 open函数 把流与一个特定的磁盘文件关联起来。

    需要指定打开模式 put函数 把一个字符写到输出流中 write函数 把内存中的一块内容写到一个输出文件流中 seekp和tellp函数 操作文件流的内部指针 close函数 关闭与一个输出文件流关联的磁盘文件 错误处理函数 在写到一个流时进行错误处理 90 90 90 输入流 重要的输入流类型: istream类最适合用于顺序文本模式输入 cin是预定义的标准输入对象 ifstream类支持磁盘文件输入 提取运算符 () 对于所有标准C++数据类型预定义了重载 它是从一个输入流对象获取数据最容易的方法46 91 91 91 ifstream 如果在构造函数中指定文件名和模式,在构造该对象 时该文件自动打开 ifstream myFile(filename,iosmode); 在调用缺省构造函数之后使用open函数来打开文件 ifstream myFile; //建立一个文件流对象 myFile.open(filename,iosmode); //打开文件filename“ 成员函数 open()get()getline()read()seekg()tellg() close()。

    点击阅读更多内容
    卖家[上传人]:小风车
    资质:实名认证