chapt1
2020-03-01 153浏览
- 1.第一章 从 C 到 C++ 浙江理工大学信息学院 孙树森
- 2.主要内容 简单的 C++ 程序 VC IDE 的使用 简单的输入输出 变量、常量声明 函数 ( 原型声明、函数重载载 、缺省参数、函数模板、 载 载载载 载载载 载载载 inline 函数 )*** 6. 引用 *** 7. 作用域运算符 8. 利用 new/delete 进行内存的动态分配 / 撤销 *** 9. 枚载载 、载载 构 10. 编译预处理 1. 2. 3. 4. 5. 19/5/14 2
- 3.1.1 最简单的 C++ 程序 Sample1. 1 /* ************************************************ * file main.cpp ***************************************************/ #include// cout needs this header file using namespace std; //use std namespace int main() { cout<<“This is a simple c++ program!”<4.从 C 到 C++ 1. main 前加 int 2. 两种注释风格 /* .... */ 和 // 3. 头文件 4. 名字空间 5. 输出使用 cout 19/5/14 45.C++ 程序的载 载 载 、载 载 载 、载 载 接及 载载载载 运行 载 Header (s) C++ source code 1 Objective code 1 compile Header (s) … … … C++ source code n compile Objective code n link Executable code Library 1 … 19/5/14 Library n 56.1.2 VC 集成开发环境的使用 创建工作空间 创建工程 编辑 编译 连接 修改、设置断点、调试等 执行 19/5/14 67.1.2 VC 集成开发环境的使用 C++ IDE 的建立 自学使用 VC++/C++ builder/ Linux codeblocks 建 立多文件载 目、 载载载载 置 include 、 lib 路径,完成简单代 载载 写 载载 、载 载 载 、断点 载载载载 置、 载载载载 、运行。 载 VC 下载 :ftp://ftp.zstu.edu.cn/developer/vs6.0/visual_studio6.iso VC 安装载 无法 载载载载 建一个 载 载 DCOM 用户帐号来注册, 参考http://support.microsoft.com/kb/25741319/5/14 78.1.3 简单的输入输出 C 语言使用 getchar,putchar,printf,scanf C++ 使用 cout , cin C 语言使用 \n, C++ 用 endl Sample 2.2 19/5/14 Sample 2.3 89.1.4 变量常量的声明 C 中的声明必须放在可执行语句前 C++ 在使用前声明即可。 C 中用 #define 定义符号常量 #define PI 3.1415926535897932 C++ 中提供了 const 定义常量的方法 const double PI= 3.1415926535897932 ; const 可以修饰指针、变量、形参、函数等 19/5/14 910.1.4 变量常量的声明 注意: const 定义的载载 行载载 型载载 define 定义的不进行类型检查 19/5/14 1011.1.5 函数 19/5/14 1112.1.5.1 函数原型声明 C 中建议 ( 不是强制 ) 使用函数原型声明, 而且声明载载 可以采用 载 载 载 载载 化形式。以下声明合法: 载载 载载 载载载 载载载 int max(int a, int b); //max 函数原型声明 int max(int ,int ); //max 函数原型声明 int max(); // 不列出参数表 max(); // 整型函数,可以省略函数载载 型 C++ 中,如果函数调用在函数定义之前,必 须采用函数原型声明。即:给出函数的类型 , 函数名,参数个数及类型。 19/5/14 1213.1.5.2 函数重载 C++ 中,同一作用域内,函数名相同,函数 参数不同的函数,即一名多用,称作函数重 载。 如: int abs(int); float abs(float); double abs(double); C 中,不允许存在同名函数。 19/5/14 1314.1.5.2 函数重载 (2) 注意: 1. 函数名必须相同 2. 参数个数或类型至少其一不同 3. 返回载载载 型可以相同或不同 载载载 载载载 载 19/5/14 1415.1.5.3 缺省参数 如果调用一个函数,许多情况用相同的实参值, 可以给出缺省值。如: set_person_record_value(char * name,char * ge nder=“Male”); 注意: 1. 在有函数声明和函数定义载载 ,缺省 载 载 载载 必载载 只在声明中 载载载载 设置 缺省,而定义中不能 值 设置。 2. 缺省参数必须自右向左连续设置,使用时亦然。 3. 有缺省参数的函数,使用缺省参数与否的各种 情况,都必须与同一作用于内同名函数构成重 载关系。 19/5/14 1516.1.5.4 函数模板 重载函数虽然可以解决相同功能的函数使用 同一函数名的问题,但必须逐个声明 / 定义 ,而且无法解决未来可能出现的数据类型。 所谓函数模板,就是把函数类型和形参类型 都用“载 型载 量 代”替。如: template < typename T>//class 关键字可以用 class T mymax (T a, T b) { return a>b?a:b;} 19/5/14 1617.1.5.4 函数模板 载 用载 载 : int j(10), k(4), intmax; double x(3.5), y=(12.9),doublemax; intmax=mymax(j,k) doublemax=mymax(x,y); 19/5/14 1718.1.5.4 函数模板 注意: 1. 类型参数可以有多个 template等等。 2. 函数模板的声明与定义不能分开。 3. 函数模板只适用于函数名、参数个数都相 同,只用类型不同的情况。 19/5/14 1819.1.5.5 inline 函数 载 载 载 , 函数的代 载 载载 载载 直接放到 载 载载 载载 用它的位 载 处。这样的函数称作 inline function, 内联函 数,内置函数。 内联函数的定义方法是,在函数定义时,在 函数的类型前增加修饰词 inline 。 如: sample 2.5.5 19/5/14 1920.1.5.5 inline 函数 #includeUsing namespace std; inline int max (int x, int y) { int z; z=(x>y)? x : y ; return z; } int main () { int a,b,c; cin>>a>>b; c=max (a+b , a*b) ; cout<<“The max is”<21.1.5.5 inline 函数 1. 内联函数的实质是用存储空间(使用更多的存储 2. 3. 4. 5. 空间)来换取时间(减少执行时间) 用 inline 仅是建议,是否内联看编译器 把代码直接嵌入到调用位置,用 define 宏也可以 实现,但 inline 有 ( 类型 ) 错误检查;宏不进行类 型检查 关键字 inline 必须与函数定义体放在一起才能使 函数成为内联,仅将 inline 放在函数声明前面不 起任何作用。 建议把 inline 函数的定义放到头文件中。 19/5/14 2122.1.6 引用 reference 引用 (reference) 又称别名 (alias), 引用的作 用是为变量另起一个名字,以便在需要的时 候方便简洁的使用该变量。 对一个变量的引用的所有操作,等价于其所 代表的变量的操作。 引用必须在声明的同时初始化(引用参数例 外),而且引用不能被赋值。 引用不是独立的变量,编译系统不为引用分 配存储单元。 19/5/14 2223.1.6 引用 reference 指针 (pointer) :存放其他变量 ( 其类型为指针的基类 型 ) 的地址的变量。使用基类型 和“ *” 来声明指针变量 . 引用 (reference) :变量的别名 . 用基类型和” &” 来声明 一个引用变量。 int a=20 ; *pa=&a int int **ppa = &pa int &ra =a; int* &rpa =pa; int ** & rppa =ppa; 19/5/14 a ra pa rpa rppa ppa 20 7751 3216 [7751] [3216] [8842] 引用必须在声明的 同时初始化!! 2324.1.6 引用 reference 1. 2. 3. 4. 如: double x; double &rx=x; // 对 Int a1,a2; int & ra;ra=a2; // 错 Float u; float &ru=u; float &rru=ru; // 对 Int *p = NULL; int a; int ra=a; p=&ra// 对 19/5/14 2425.1.6.1 引用作为函数参数 C++ 增加引用,主要是利用它作载 函数参数,以 载载载载载载载 充函数载 载 载 数据的功能。 载载载载载 将变量名作为实参,传递给形参的是值,单向 传递变量的指针,传递的是指针的值——变量的地 址,使用麻载 。 载 传递变量的别名,语法简单,双向传递。引用参 数,调用者通知被调用者,在不知道引用实参的 真实变量名的情况下,使用 ( 包括改变 ) 它们。 引用返回:所返回的引用对应的变量必须作用域 内。 在类中使用,有特殊用途,将进一步讲述 例子: swap 19/5/14 2526.1.7 作用域运算符 作用域 (scope), 又称可见性 (visibility) :指在源程序 中可以用名字 ( 标示符 ) 来引用载载 量或函数的区域。 载载 载载载 载载 变量的作用域可分为: block, function , file , program 。 作用域是一个空间概念,是对标示符而言的。 嵌套载载 中,内 载 载 载载 的同名 载 载 载载 量将屏蔽外 载 载 载 载 载载 的同名 载 载 载载 量。 载 形参具有函数作用域。 变量 的生存期:程序运行期 间变量实际占用内存或寄 存器的时间。 在变量的作用域内,变量必然存在;在变量的生存 期内,变量不一定有效 ( 可见 ) ,例如:在某些区 域变量不能被使用,变量名无效等。 19/5/14 2627.1.7 作用域运算符 为了对不同的作用域的标识符进行使用, C+ + 引入了作用域运算符 :: 语法: [ 类名 名字空间名 ]:: 变量 函数 类 名字 空间 :: 前如果不加修饰,则表示全局作用域。如 : 19/5/14 2728.1.8 内存的动态分配 / 撤销 C 中用 malloc 和 free 进行内存的动态分配与 撤销 C++ 使用功能更强的 new 和 delete 进行内存 的动态分配与撤销。 new/delete 的一般用法: int * pInt= new int(10); delete pInt; double * pDouble = new double; delete pDouble ; 19/5/14 2829.1.8 内存的动态分配 / 撤销 float *pfloat = new float[99]; delete [] pfloat; 可以用 sizeof 运算法计算一个变量的内存空 间(字节数)。 int a ; int bytes = sizeof(a); double x ; int bytes = sizeof(x); 19/5/14 2930.1.9 枚载 、 载载 载 构 enum WEEKDAY{SUN,MON,TUES,WED,T HUR,FRI,SAT} ; C: enum WEEKDAY workday = SUN; C++ WEEKDAY workday=SUN ; 19/5/14 3031.1.9 枚举、结构 struct student{ int no; char name[20]; int age; char sex; float score; C struct STUDENT john; C++ STUDENT john; }*pstudetn; 19/5/14 3132.1.10 预处理命令 先预处理,在进行编译。 预处理以“ #” 开载载 ,载载 独占一行, 载 载 载 载 载载 行用 载 ” \”, 命令末尾不使用” ;” 作为结束标志。 三类预处理 文件包含 宏定义 条件载载 19/5/14 3233.2.10.1 文件包含预处理 #include “myheader.h” #include文件名可以包含路径 #include 可以包含载载 文件( 载 载 *.h )和 *.cpp 文件 #include 预处理行一般放在文件开头,也可以放在 文件末尾。 包含顺序对编译有影响。 为防止重复包含,常常和宏定义一同使用。 19/5/14 3334.1.10.2 宏定义预处理 #define 宏名 ( 形参表 ) 字符串 例如: #define PI 3.141592653589792 #define max(a,b) ( (a)>(b)?(a):(b) ) #define ENABLE_DEBUG 19/5/14 3435.1.10.2 宏定义预处理 define and typedef typedef int INT32; typedef 与变量一样具有作用域,内层覆盖外层。如: {typedef int INT32; {typedef long INT32;} } 而且可以重复定义 , 如: {typedef int INT32; typedef int INT32;} 也可以把先前定义的数据类型作为固有类型,如: { typedef int INT32; typedef INT32 INT_4BYTE;} 但在同一作用域内,不能用相同的名字定义不同的数据类型 , 如: {typedef int INT32;typedef long INT32;//ERROR} 19/5/14 3536.1.10.2 宏定义预处理 typedef char * STRING; STRING szName,szTitle;// 相当于 char * szName,*szTitle; #define char* String String szName,szTitle;// 相当于 char * szName,szTitle; //typedef 定义的类型,是作为一个”数据类 型”来解释的。 19/5/14 3637.1.10.2 宏定义预处理 Typedef 定义的数据类型不能”组合使用”, 如: typedef int INT32; unsigned INT32 uInt;//error 但 define 可以实现上述目的: #define int INT32 unsigned INT32 uInt;//OK 19/5/14 3738.1.10.3 条件编译预处理 #ifdefine __WIN32__ #include “windows header” [#else #include “linux header”] #endif //header file #ifndef _MY_HEADER_ #define _MY_HEADER_ // part one [#else //part two] #endif 19/5/14 3839.2.10.4 #pragma and “#” #pragma warning(disable 4101) // 意思是不载载 示4101 号警告 #Pragma message(“Message to be displaye d”) #pragma comment(lib,“lib/mylib.lib") // 用 lib 关键字,可以连入一个库文件。 19/5/14 3940.1.10.4 #pragma and “#” #define cat(a,b) (a##b) #define mystr(x) (#x) cout<41.1.10.5 一个有用的 DEBUG 宏 #ifdef DEBUG dbgprintf printf #else dbgprintf //printf #endif 19/5/14 4142.1.10.5 一个有用的 DEBUG 宏 #ifdef DEBUG #define dbgprintf printf #else #define dbgprintf \/ /printf #endif 19/5/14 4243.C++ 与 C 的区别: 1. 注载载 : Cstyle:'>style:
- 4.从 C 到 C++ 1. main 前加 int 2. 两种注释风格 /* .... */ 和 // 3. 头文件 4. 名字空间 5. 输出使用 cout 19/5/14 4
- 5.C++ 程序的载 载 载 、载 载 载 、载 载 接及 载载载载 运行 载 Header (s) C++ source code 1 Objective code 1 compile Header (s) … … … C++ source code n compile Objective code n link Executable code Library 1 … 19/5/14 Library n 5
- 6.1.2 VC 集成开发环境的使用 创建工作空间 创建工程 编辑 编译 连接 修改、设置断点、调试等 执行 19/5/14 6
- 7.1.2 VC 集成开发环境的使用 C++ IDE 的建立 自学使用 VC++/C++ builder/ Linux codeblocks 建 立多文件载 目、 载载载载 置 include 、 lib 路径,完成简单代 载载 写 载载 、载 载 载 、断点 载载载载 置、 载载载载 、运行。 载 VC 下载 :ftp://ftp.zstu.edu.cn/developer/vs6.0/visual_studio6.iso VC 安装载 无法 载载载载 建一个 载 载 DCOM 用户帐号来注册, 参考http://support.microsoft.com/kb/25741319/5/14 7
- 8.1.3 简单的输入输出 C 语言使用 getchar,putchar,printf,scanf C++ 使用 cout , cin C 语言使用 \n, C++ 用 endl Sample 2.2 19/5/14 Sample 2.3 8
- 9.1.4 变量常量的声明 C 中的声明必须放在可执行语句前 C++ 在使用前声明即可。 C 中用 #define 定义符号常量 #define PI 3.1415926535897932 C++ 中提供了 const 定义常量的方法 const double PI= 3.1415926535897932 ; const 可以修饰指针、变量、形参、函数等 19/5/14 9
- 10.1.4 变量常量的声明 注意: const 定义的载载 行载载 型载载 define 定义的不进行类型检查 19/5/14 10
- 11.1.5 函数 19/5/14 11
- 12.1.5.1 函数原型声明 C 中建议 ( 不是强制 ) 使用函数原型声明, 而且声明载载 可以采用 载 载 载 载载 化形式。以下声明合法: 载载 载载 载载载 载载载 int max(int a, int b); //max 函数原型声明 int max(int ,int ); //max 函数原型声明 int max(); // 不列出参数表 max(); // 整型函数,可以省略函数载载 型 C++ 中,如果函数调用在函数定义之前,必 须采用函数原型声明。即:给出函数的类型 , 函数名,参数个数及类型。 19/5/14 12
- 13.1.5.2 函数重载 C++ 中,同一作用域内,函数名相同,函数 参数不同的函数,即一名多用,称作函数重 载。 如: int abs(int); float abs(float); double abs(double); C 中,不允许存在同名函数。 19/5/14 13
- 14.1.5.2 函数重载 (2) 注意: 1. 函数名必须相同 2. 参数个数或类型至少其一不同 3. 返回载载载 型可以相同或不同 载载载 载载载 载 19/5/14 14
- 15.1.5.3 缺省参数 如果调用一个函数,许多情况用相同的实参值, 可以给出缺省值。如: set_person_record_value(char * name,char * ge nder=“Male”); 注意: 1. 在有函数声明和函数定义载载 ,缺省 载 载 载载 必载载 只在声明中 载载载载 设置 缺省,而定义中不能 值 设置。 2. 缺省参数必须自右向左连续设置,使用时亦然。 3. 有缺省参数的函数,使用缺省参数与否的各种 情况,都必须与同一作用于内同名函数构成重 载关系。 19/5/14 15
- 16.1.5.4 函数模板 重载函数虽然可以解决相同功能的函数使用 同一函数名的问题,但必须逐个声明 / 定义 ,而且无法解决未来可能出现的数据类型。 所谓函数模板,就是把函数类型和形参类型 都用“载 型载 量 代”替。如: template < typename T>//class 关键字可以用 class T mymax (T a, T b) { return a>b?a:b;} 19/5/14 16
- 17.1.5.4 函数模板 载 用载 载 : int j(10), k(4), intmax; double x(3.5), y=(12.9),doublemax; intmax=mymax(j,k) doublemax=mymax(x,y); 19/5/14 17
- 18.1.5.4 函数模板 注意: 1. 类型参数可以有多个 template等等。 2. 函数模板的声明与定义不能分开。 3. 函数模板只适用于函数名、参数个数都相 同,只用类型不同的情况。 19/5/14 18
- 19.1.5.5 inline 函数 载 载 载 , 函数的代 载 载载 载载 直接放到 载 载载 载载 用它的位 载 处。这样的函数称作 inline function, 内联函 数,内置函数。 内联函数的定义方法是,在函数定义时,在 函数的类型前增加修饰词 inline 。 如: sample 2.5.5 19/5/14 19
- 20.1.5.5 inline 函数 #includeUsing namespace std; inline int max (int x, int y) { int z; z=(x>y)? x : y ; return z; } int main () { int a,b,c; cin>>a>>b; c=max (a+b , a*b) ; cout<<“The max is”<21.1.5.5 inline 函数 1. 内联函数的实质是用存储空间(使用更多的存储 2. 3. 4. 5. 空间)来换取时间(减少执行时间) 用 inline 仅是建议,是否内联看编译器 把代码直接嵌入到调用位置,用 define 宏也可以 实现,但 inline 有 ( 类型 ) 错误检查;宏不进行类 型检查 关键字 inline 必须与函数定义体放在一起才能使 函数成为内联,仅将 inline 放在函数声明前面不 起任何作用。 建议把 inline 函数的定义放到头文件中。 19/5/14 2122.1.6 引用 reference 引用 (reference) 又称别名 (alias), 引用的作 用是为变量另起一个名字,以便在需要的时 候方便简洁的使用该变量。 对一个变量的引用的所有操作,等价于其所 代表的变量的操作。 引用必须在声明的同时初始化(引用参数例 外),而且引用不能被赋值。 引用不是独立的变量,编译系统不为引用分 配存储单元。 19/5/14 2223.1.6 引用 reference 指针 (pointer) :存放其他变量 ( 其类型为指针的基类 型 ) 的地址的变量。使用基类型 和“ *” 来声明指针变量 . 引用 (reference) :变量的别名 . 用基类型和” &” 来声明 一个引用变量。 int a=20 ; *pa=&a int int **ppa = &pa int &ra =a; int* &rpa =pa; int ** & rppa =ppa; 19/5/14 a ra pa rpa rppa ppa 20 7751 3216 [7751] [3216] [8842] 引用必须在声明的 同时初始化!! 2324.1.6 引用 reference 1. 2. 3. 4. 如: double x; double &rx=x; // 对 Int a1,a2; int & ra;ra=a2; // 错 Float u; float &ru=u; float &rru=ru; // 对 Int *p = NULL; int a; int ra=a; p=&ra// 对 19/5/14 2425.1.6.1 引用作为函数参数 C++ 增加引用,主要是利用它作载 函数参数,以 载载载载载载载 充函数载 载 载 数据的功能。 载载载载载 将变量名作为实参,传递给形参的是值,单向 传递变量的指针,传递的是指针的值——变量的地 址,使用麻载 。 载 传递变量的别名,语法简单,双向传递。引用参 数,调用者通知被调用者,在不知道引用实参的 真实变量名的情况下,使用 ( 包括改变 ) 它们。 引用返回:所返回的引用对应的变量必须作用域 内。 在类中使用,有特殊用途,将进一步讲述 例子: swap 19/5/14 2526.1.7 作用域运算符 作用域 (scope), 又称可见性 (visibility) :指在源程序 中可以用名字 ( 标示符 ) 来引用载载 量或函数的区域。 载载 载载载 载载 变量的作用域可分为: block, function , file , program 。 作用域是一个空间概念,是对标示符而言的。 嵌套载载 中,内 载 载 载载 的同名 载 载 载载 量将屏蔽外 载 载 载 载 载载 的同名 载 载 载载 量。 载 形参具有函数作用域。 变量 的生存期:程序运行期 间变量实际占用内存或寄 存器的时间。 在变量的作用域内,变量必然存在;在变量的生存 期内,变量不一定有效 ( 可见 ) ,例如:在某些区 域变量不能被使用,变量名无效等。 19/5/14 2627.1.7 作用域运算符 为了对不同的作用域的标识符进行使用, C+ + 引入了作用域运算符 :: 语法: [ 类名 名字空间名 ]:: 变量 函数 类 名字 空间 :: 前如果不加修饰,则表示全局作用域。如 : 19/5/14 2728.1.8 内存的动态分配 / 撤销 C 中用 malloc 和 free 进行内存的动态分配与 撤销 C++ 使用功能更强的 new 和 delete 进行内存 的动态分配与撤销。 new/delete 的一般用法: int * pInt= new int(10); delete pInt; double * pDouble = new double; delete pDouble ; 19/5/14 2829.1.8 内存的动态分配 / 撤销 float *pfloat = new float[99]; delete [] pfloat; 可以用 sizeof 运算法计算一个变量的内存空 间(字节数)。 int a ; int bytes = sizeof(a); double x ; int bytes = sizeof(x); 19/5/14 2930.1.9 枚载 、 载载 载 构 enum WEEKDAY{SUN,MON,TUES,WED,T HUR,FRI,SAT} ; C: enum WEEKDAY workday = SUN; C++ WEEKDAY workday=SUN ; 19/5/14 3031.1.9 枚举、结构 struct student{ int no; char name[20]; int age; char sex; float score; C struct STUDENT john; C++ STUDENT john; }*pstudetn; 19/5/14 3132.1.10 预处理命令 先预处理,在进行编译。 预处理以“ #” 开载载 ,载载 独占一行, 载 载 载 载 载载 行用 载 ” \”, 命令末尾不使用” ;” 作为结束标志。 三类预处理 文件包含 宏定义 条件载载 19/5/14 3233.2.10.1 文件包含预处理 #include “myheader.h” #include文件名可以包含路径 #include 可以包含载载 文件( 载 载 *.h )和 *.cpp 文件 #include 预处理行一般放在文件开头,也可以放在 文件末尾。 包含顺序对编译有影响。 为防止重复包含,常常和宏定义一同使用。 19/5/14 3334.1.10.2 宏定义预处理 #define 宏名 ( 形参表 ) 字符串 例如: #define PI 3.141592653589792 #define max(a,b) ( (a)>(b)?(a):(b) ) #define ENABLE_DEBUG 19/5/14 3435.1.10.2 宏定义预处理 define and typedef typedef int INT32; typedef 与变量一样具有作用域,内层覆盖外层。如: {typedef int INT32; {typedef long INT32;} } 而且可以重复定义 , 如: {typedef int INT32; typedef int INT32;} 也可以把先前定义的数据类型作为固有类型,如: { typedef int INT32; typedef INT32 INT_4BYTE;} 但在同一作用域内,不能用相同的名字定义不同的数据类型 , 如: {typedef int INT32;typedef long INT32;//ERROR} 19/5/14 3536.1.10.2 宏定义预处理 typedef char * STRING; STRING szName,szTitle;// 相当于 char * szName,*szTitle; #define char* String String szName,szTitle;// 相当于 char * szName,szTitle; //typedef 定义的类型,是作为一个”数据类 型”来解释的。 19/5/14 3637.1.10.2 宏定义预处理 Typedef 定义的数据类型不能”组合使用”, 如: typedef int INT32; unsigned INT32 uInt;//error 但 define 可以实现上述目的: #define int INT32 unsigned INT32 uInt;//OK 19/5/14 3738.1.10.3 条件编译预处理 #ifdefine __WIN32__ #include “windows header” [#else #include “linux header”] #endif //header file #ifndef _MY_HEADER_ #define _MY_HEADER_ // part one [#else //part two] #endif 19/5/14 3839.2.10.4 #pragma and “#” #pragma warning(disable 4101) // 意思是不载载 示4101 号警告 #Pragma message(“Message to be displaye d”) #pragma comment(lib,“lib/mylib.lib") // 用 lib 关键字,可以连入一个库文件。 19/5/14 3940.1.10.4 #pragma and “#” #define cat(a,b) (a##b) #define mystr(x) (#x) cout<41.1.10.5 一个有用的 DEBUG 宏 #ifdef DEBUG dbgprintf printf #else dbgprintf //printf #endif 19/5/14 4142.1.10.5 一个有用的 DEBUG 宏 #ifdef DEBUG #define dbgprintf printf #else #define dbgprintf \/ /printf #endif 19/5/14 4243.C++ 与 C 的区别: 1. 注载载 : Cstyle:'>style:
- 21.1.5.5 inline 函数 1. 内联函数的实质是用存储空间(使用更多的存储 2. 3. 4. 5. 空间)来换取时间(减少执行时间) 用 inline 仅是建议,是否内联看编译器 把代码直接嵌入到调用位置,用 define 宏也可以 实现,但 inline 有 ( 类型 ) 错误检查;宏不进行类 型检查 关键字 inline 必须与函数定义体放在一起才能使 函数成为内联,仅将 inline 放在函数声明前面不 起任何作用。 建议把 inline 函数的定义放到头文件中。 19/5/14 21
- 22.1.6 引用 reference 引用 (reference) 又称别名 (alias), 引用的作 用是为变量另起一个名字,以便在需要的时 候方便简洁的使用该变量。 对一个变量的引用的所有操作,等价于其所 代表的变量的操作。 引用必须在声明的同时初始化(引用参数例 外),而且引用不能被赋值。 引用不是独立的变量,编译系统不为引用分 配存储单元。 19/5/14 22
- 23.1.6 引用 reference 指针 (pointer) :存放其他变量 ( 其类型为指针的基类 型 ) 的地址的变量。使用基类型 和“ *” 来声明指针变量 . 引用 (reference) :变量的别名 . 用基类型和” &” 来声明 一个引用变量。 int a=20 ; *pa=&a int int **ppa = &pa int &ra =a; int* &rpa =pa; int ** & rppa =ppa; 19/5/14 a ra pa rpa rppa ppa 20 7751 3216 [7751] [3216] [8842] 引用必须在声明的 同时初始化!! 23
- 24.1.6 引用 reference 1. 2. 3. 4. 如: double x; double &rx=x; // 对 Int a1,a2; int & ra;ra=a2; // 错 Float u; float &ru=u; float &rru=ru; // 对 Int *p = NULL; int a; int ra=a; p=&ra// 对 19/5/14 24
- 25.1.6.1 引用作为函数参数 C++ 增加引用,主要是利用它作载 函数参数,以 载载载载载载载 充函数载 载 载 数据的功能。 载载载载载 将变量名作为实参,传递给形参的是值,单向 传递变量的指针,传递的是指针的值——变量的地 址,使用麻载 。 载 传递变量的别名,语法简单,双向传递。引用参 数,调用者通知被调用者,在不知道引用实参的 真实变量名的情况下,使用 ( 包括改变 ) 它们。 引用返回:所返回的引用对应的变量必须作用域 内。 在类中使用,有特殊用途,将进一步讲述 例子: swap 19/5/14 25
- 26.1.7 作用域运算符 作用域 (scope), 又称可见性 (visibility) :指在源程序 中可以用名字 ( 标示符 ) 来引用载载 量或函数的区域。 载载 载载载 载载 变量的作用域可分为: block, function , file , program 。 作用域是一个空间概念,是对标示符而言的。 嵌套载载 中,内 载 载 载载 的同名 载 载 载载 量将屏蔽外 载 载 载 载 载载 的同名 载 载 载载 量。 载 形参具有函数作用域。 变量 的生存期:程序运行期 间变量实际占用内存或寄 存器的时间。 在变量的作用域内,变量必然存在;在变量的生存 期内,变量不一定有效 ( 可见 ) ,例如:在某些区 域变量不能被使用,变量名无效等。 19/5/14 26
- 27.1.7 作用域运算符 为了对不同的作用域的标识符进行使用, C+ + 引入了作用域运算符 :: 语法: [ 类名 名字空间名 ]:: 变量 函数 类 名字 空间 :: 前如果不加修饰,则表示全局作用域。如 : 19/5/14 27
- 28.1.8 内存的动态分配 / 撤销 C 中用 malloc 和 free 进行内存的动态分配与 撤销 C++ 使用功能更强的 new 和 delete 进行内存 的动态分配与撤销。 new/delete 的一般用法: int * pInt= new int(10); delete pInt; double * pDouble = new double; delete pDouble ; 19/5/14 28
- 29.1.8 内存的动态分配 / 撤销 float *pfloat = new float[99]; delete [] pfloat; 可以用 sizeof 运算法计算一个变量的内存空 间(字节数)。 int a ; int bytes = sizeof(a); double x ; int bytes = sizeof(x); 19/5/14 29
- 30.1.9 枚载 、 载载 载 构 enum WEEKDAY{SUN,MON,TUES,WED,T HUR,FRI,SAT} ; C: enum WEEKDAY workday = SUN; C++ WEEKDAY workday=SUN ; 19/5/14 30
- 31.1.9 枚举、结构 struct student{ int no; char name[20]; int age; char sex; float score; C struct STUDENT john; C++ STUDENT john; }*pstudetn; 19/5/14 31
- 32.1.10 预处理命令 先预处理,在进行编译。 预处理以“ #” 开载载 ,载载 独占一行, 载 载 载 载 载载 行用 载 ” \”, 命令末尾不使用” ;” 作为结束标志。 三类预处理 文件包含 宏定义 条件载载 19/5/14 32
- 33.2.10.1 文件包含预处理 #include “myheader.h” #include文件名可以包含路径 #include 可以包含载载 文件( 载 载 *.h )和 *.cpp 文件 #include 预处理行一般放在文件开头,也可以放在 文件末尾。 包含顺序对编译有影响。 为防止重复包含,常常和宏定义一同使用。 19/5/14 33
- 34.1.10.2 宏定义预处理 #define 宏名 ( 形参表 ) 字符串 例如: #define PI 3.141592653589792 #define max(a,b) ( (a)>(b)?(a):(b) ) #define ENABLE_DEBUG 19/5/14 34
- 35.1.10.2 宏定义预处理 define and typedef typedef int INT32; typedef 与变量一样具有作用域,内层覆盖外层。如: {typedef int INT32; {typedef long INT32;} } 而且可以重复定义 , 如: {typedef int INT32; typedef int INT32;} 也可以把先前定义的数据类型作为固有类型,如: { typedef int INT32; typedef INT32 INT_4BYTE;} 但在同一作用域内,不能用相同的名字定义不同的数据类型 , 如: {typedef int INT32;typedef long INT32;//ERROR} 19/5/14 35
- 36.1.10.2 宏定义预处理 typedef char * STRING; STRING szName,szTitle;// 相当于 char * szName,*szTitle; #define char* String String szName,szTitle;// 相当于 char * szName,szTitle; //typedef 定义的类型,是作为一个”数据类 型”来解释的。 19/5/14 36
- 37.1.10.2 宏定义预处理 Typedef 定义的数据类型不能”组合使用”, 如: typedef int INT32; unsigned INT32 uInt;//error 但 define 可以实现上述目的: #define int INT32 unsigned INT32 uInt;//OK 19/5/14 37
- 38.1.10.3 条件编译预处理 #ifdefine __WIN32__ #include “windows header” [#else #include “linux header”] #endif //header file #ifndef _MY_HEADER_ #define _MY_HEADER_ // part one [#else //part two] #endif 19/5/14 38
- 39.2.10.4 #pragma and “#” #pragma warning(disable 4101) // 意思是不载载 示4101 号警告 #Pragma message(“Message to be displaye d”) #pragma comment(lib,“lib/mylib.lib") // 用 lib 关键字,可以连入一个库文件。 19/5/14 39
- 40.1.10.4 #pragma and “#” #define cat(a,b) (a##b) #define mystr(x) (#x) cout<41.1.10.5 一个有用的 DEBUG 宏 #ifdef DEBUG dbgprintf printf #else dbgprintf //printf #endif 19/5/14 4142.1.10.5 一个有用的 DEBUG 宏 #ifdef DEBUG #define dbgprintf printf #else #define dbgprintf \/ /printf #endif 19/5/14 4243.C++ 与 C 的区别: 1. 注载载 : Cstyle:'>style:
- 41.1.10.5 一个有用的 DEBUG 宏 #ifdef DEBUG dbgprintf printf #else dbgprintf //printf #endif 19/5/14 41
- 42.1.10.5 一个有用的 DEBUG 宏 #ifdef DEBUG #define dbgprintf printf #else #define dbgprintf \/ /printf #endif 19/5/14 42
- 43.C++ 与 C 的区别: 1. 注载载 : Cstyle:'>style: