Chap2从C快速过渡到C++.doc_第1页
Chap2从C快速过渡到C++.doc_第2页
Chap2从C快速过渡到C++.doc_第3页
Chap2从C快速过渡到C++.doc_第4页
Chap2从C快速过渡到C++.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Chap2 C+的变量、类型及函数(从C快速过渡到C+)本章内容:n 2.1 数据类型n 2.2 声明及定义n 2.3 C+的常量与变量n 2.4 C+的指针n 2.5 引用类型n 2.6 C+函数 2.6.1函数原型 2.6.2函数重载 2.6.3函数参数 2.6.4内联函数重点:2.3、2.5、2.62.1 数据类型(DataType)1基本数据类型保留了C的所有基本DataType2复杂数据类型C+采用 *、&、 、( )等运算符派生出如下复杂的DataType。其中,*、&是单目运算符,放在标识符前面; 、( )是双目运算符,放在标识符后面。数组格式:数组名下标例: char s =”abcd”; s0=a; int a4=1,2,3,4;指针格式:*指针名例: int *pi; float *pf; int (*pfun)(char *, int len); /*函数指针,表示pfun首先是一指 针,该指针指向具有2个形参的函数*/引用格式:&引用名例: int i=5; int &refi=i;class类型(包括struct和union类型)用户自定义的一种新的DataType,用来表示客观世界某类实体的抽象数据类型(Abstract Data TypeADT)常量(只读变量)C+保留了C的常量定义风格,且对它的符号常量加以扩展。如#define tabsize 4 const int tabsize=4;#define PI 3.1415926 const float PI=3.14159262.2 声明与定义 声明:对某个名及其内涵的不完整描述 定义:对该名及其内涵的完整描述l 变量声明:不分配存储单元 或 不初始化的变量定义。如, extern int i; /声明 extern int i=0; /定义l 函数声明:不定义函数体的函数原型描述。如, long sum(int a, int b); /声明 long sum(int a, int b) /定义 return a+b; l 注意:对于未初始化的全局变量、静态变量,C/C+缺省地初始化为0(定义)对于局部变量,C/C+都不会缺省初始化(声明)C与C+在声明和定义时的不同:n C语言:一般只允许以常量表达式初始化变量,局部非静态变量可以用任意表达式初始化。变量声明和定义必在语句前。n C+语言:所有变量都可以用任意表达式初始化。变量声明和定义不必在语句前。兼容C,局部非静态变量如不初始化,则其值不确定。n 常量表达式:编译时可计算出常量值。如:3,3.14*3*3,size 2,sizeof(int2),sizeof(3+printf(“ABC”)n 任意表达式:常量、变量、函数调用等组成。只能在运行时计算出值。如: 常量表达式 A,3+A printf(“ABCDEF”) 3+ printf(“ABCDEF”)注意:int2是类型表达式,而非值表达式。值表达式包括常量表达式和任意表达式。值表达式又可分为左值或右值表达式。2.3 C+的常量与变量2.3.1常量(只读变量)l 常量:在程序运行期间其值不能被修改,在定义时必须初始化l C+对符号常量加以扩展,对任何类型的对象(指针变量、引用变量、结构变量、数组、class类型的对象)都可以定义成常量。l 定义格式:const 数据类型定义初始值;1基本DataType,如const int size=100; const float pi=3.1415;int aryIntsize;2数组 const int data =1,2,3; int const data =1,2,3;data1=10; /出错3结构变量 struct Complexdouble real;double image;const Complex X=1.0, 1.0;X.real=2.0; /错误X.image=3.0; /错误4指针 将指针所指的目标变量定义成只读 指向常量的指针const char *pc; pc=”abcd”;定义格式: const 类型 *指针名地址表达式;/ .可选 ? 类型 const *指针名;例:const char *pc=”abcd”; / *pc为只读变量,不可变pc3=f; / *pc=a; / pc=”sdef”; / 指针所指存储单元的值是不可变,而指针的地址值是可以改变(即,可以重新给指针定向)。即,*pc,*(pc+1),.,pc0,pc1,. 不可重新赋值 pc可重新赋值将指针本身定义成只读 常量指针定义格式: 类型 *const 指针名地址表达式; /必须在定义同时初始化例:char * const pc=”abcd”; / pc不可变,*pc可变pc3=f; /pc = “sdef”; / 指针所具有的地址值不可变,而指针所指存储单元的值是可以改变。即, pc不可重新赋值 *pc,*(pc+1),.,pc0,pc1,. 可重新赋值指针和其所指对象同时定义为常量 指向常量的常量指针定义格式: const 类型 * const 指针名地址表达式; /在定义同时初始化例:const char * const cpc=”abcd”; / cpc和*cpc都不可变cpc3=f; /cpc = “sdef”; /指针所具有的地址值和指针所指存储单元的值都不可变。【小结】名称定义格式举例指向常量的指针const *p; const *p;const int *pi;int const *pi;常量指针 *const p;int *const pi=&i;指向常量的常量指针const *const p;const int *const cpi=&i;2.3.2 变量l 保留了C定义变量方式,新增:1基本类型(BDT)变量初始化方法 例: int i=6; int i(6); char c=a; char c(a);格式:BDT 变量名(初始值); BDT 变量名=初始值;2变量只要在使用之前定义or声明即可,不必集中在作用域的开头和执行语句之前3作用域运算符 :若全局变量与局部变量同名,则在局部变量的作用域内同名的全局变量被隐藏起来。C无法访问同名的全局变量,即不可见。C+,用:访问被隐藏的全局变量,解决了同名冲突问题。例: #include /C+输入/输出流库 stdio.h int x=6;输出:Local x=1Global x=6 void main( ) int x=1;cout”Local x=”xendl;cout”Global x=”:xendl; 2.4 C+的指针 1常量指针:变量的地址、数组名、结构数组名、对象数组名、函数名等, *const 说明的指针名 指针变量:用来存储另一变量(or对象)的地址 2必须先给指针变量赋地址值(“定向”)后,指针变量才能参加运算和操作,否则将可能造成系统的故障例:float *px, *py; float x, y, *px=&x, *py=&y; *px=12.6; /,使用了未定向的指针变量 *py=16.8; / 3void型指针:所指向的对象的类型不定 程序不能往任意类型不确定的存储单元赋值void型指针可以指向任意类型的目标变量,如:地址常量、变量地址、已定向的各种类型指针在向void型指针指向的对象赋值时,或 将void型指针赋给其它类型指针时,必须采用强类型转换,将它变成指向相应类型的指针如,float q, *m=&q; void *r=m; / *r=3.45; / 原因: *(float *)r=3.45; / int a=2, *pi=&a; pi=(int *)r; /4空指针 指针变量的值为0(NULL)l 并不是指针变量存储空间为空,而是有特定的值(0),类似于数学上的零矢量,其长度为0而指向是任意的。l 程序中应尽量避免使用空指针2.5 引用变量(简称“引用”)l 引用就是给变量取一个别名,即:新变量与原变量共享一个地址,具有相同的值。l 是C+的一种特殊类型的变量,既不同于普通变量,也不同于指针变量l 定义格式: DataType &引用名变量名; /定义同时必须初始化l 例: int i=50; int &ref=i; /ref是整型变量i的引用,ref与i共享同一存储单元注:引用必须初始化,除非是用作函数参数or返回值;通过初始化 引用,使它成为被引用对象的别名。2.5.1 引用的初始化l 与变量赋初值不同。其实质是靠常量指针实现的,即:用被引用变量的地址&i来初始化常量指针&ref。因此,初始化后引用的地址值&ref不可变,总是指向被引用变量il 执行过程分析:int i=50; /给变量i分配一个内存空间,其地址值&iint &ref=i; /*编译系统并不给ref分配内存空间,而是产生一个常 量指针&ref;使&ref指向i,即将&i&ref;一旦初 始化后,&ref总是指向i,正如ref是i境中的映像*/ int iint refint ref镜子映像&i&ref&i &ref地址 常量指针l 引用与被引用变量通过地址相联系,因此,引用是指针的另一表示形式2.5.2 引用的使用说明1对引用的操作等价于对被引用变量的操作,即ref+; / i+;ref=i+2; /i=?, ref=?2可用某个引用ref给一个变量n赋值,即:int n=ref;3可将引用的地址值&ref指针p,即:int *p=&ref; /p指向被引用变量i考虑:如何引用一个常量?4初始化引用时必须用类型相同的变量名, 若引用的是一个常量,可按下面两种方式定义引用: const int &j=120; / 若 int &j=120; ? cannot convert from const int to int & int i=120; /增加一个临时的中间变量过渡int &j=i;若需要引用类型不同的变量,则增加一个临时的中间变量过渡e.g: float f=5.6f; int temp=(int )f; int &ref=temp;5引用的用途(后面讲)2.5.3 引用的限制1不能说明引用的引用,如 char *p; &ref; 2不能建立引用数组,如 int a2; int &ref2; 3不能引用void类型变量,如 void &sum( ); 4不能用类型初始化引用,如 int &ref=int; 5有空指针,但无空引用,如 int *pi=NULL; int &ri=NULL; 2.6 C+函数l 普通函数、友元函数、构造函数、析构函数、内联函数.l 任意类型的函数都可作原型声明与内联声明2.6.1 函数原型l 用于描述函数的参数和返回类型l 通过原型声明,当访问函数时,编译程序根据预先声明的函数原型对函数参数和返回类型作一致性检查(强类型语言)l 在原型中,可以不说明参数名,但必须定义参数类型,如 double sin(double x); double cos(double );l 标准函数的原型声明包含在各种头文件(*.h)中,所以必须先包含相应的头文件,才能使用对应的函数。(非标准函数用法一样)2.6.2 函数重载1引入目的:解决不同类型的对象需要完成相同or相似的任务 iPrint(int )打印整数 fPrint(float )打印实数 dPrint(double )打印浮点数 cPrint(char )打印字符串2含义:同一作用域内,多个函数名称相同,但参数个数或类型有所不同,则这些同名函数称为“重载函数”。(一个函数可以有多个不同的实现版本)如,打印字符串、int、double数据的函数Print( )#include void Print(char *str) cout”string:”str; void Print(int val) cout”nint:”val; void Print(double val) cout”ndouble:”val; void main( )int a(6); Print(“Hello!”);Print(a);Print(a);Print(1.6);Print(1);重载只与函数的参数有关,而与函数的返回类型无关 重载函数的参数匹配原则: 找与实参个数、类型完全相同的函数,找到,调用之,否则, 找一个严格匹配参数类型的函数,即: int 形参 实参:0、char、short int double 形参 实参:float、double2.6.3 函数参数1. 省略参数(可变参数)用省略号表示,即函数可以有任意个任意类型的参数。如, int printf(const char *format, );long sum(int n, .) long s=0; int *p=&n+1; for (int k=0; kn; k+) s+=pk; return s;void main( ) int a=4; long s=sum(3,a,2,5); 缺省参数:具有默认值的参数2缺省参数的设置C+中,允许在函数原型的声明或定义中,给一个or多个参数指定默认值(缺省值),以后在调用该函数时,若缺省参数没有传递实参,就使用其指定的默认值作为该参数的实参值。如由常量、变量、函数调用等构成的表达式,如:z=f(a,b); z=a+b; .#include int m(8);int &n=m;int Plus(int x, int y=7, int z=2*n) return x+y+z; void main( )int a(5), b(15), c(20);int sum=Plus(a, b); / sum=?cout”sum=”sum; / 可以用任意类型的表达式指定缺省值,但表达式中不能出现同一个参数表的参数,如:int f(int x, int y=x+); /在一个函数中,可指定多个(甚至全部)缺省参数,但所有缺省参数必须出现在非缺省参数的右部,不能交叉指定。不能同时在函数的原型声明和函数定义中定义缺省参数。int u, v, m(int, int);int a(int x=5,int y=m(u,v); /用函数调用指定缺省值int b(int x=1,char,int z=1); /错:x在非缺省参数左边int a(int,int y=1,int); /错:缺省参数y不在最右部int b(int x=3); /声明b(int)缺省值x=3int b(int x=3) return x*x; /错:不能再次定义x=3int f(int x, int y=x+); /错:表达式有同参数表的参数注意:上述函数调用的实际调用形式为f(x, x+)。对于x=3,自左至右计算函数参数的调用为f(3, 3),自右至左计算函数参数的调用为f(4, 3),这种不一致会导致程序的不可移植性。当调用函数时,若使用缺省值,必须从右左连续采用缺省值,“采用”与“不采用”不能交叉。当实参个数形参个数时,编译系统按照左右的顺序用缺省值来补足所缺少的实参。如,int Plus(int x, int y=7, int z=2*n)Plus(a, b); /ax; by; z采用默认值( 2*n )Plus(a); /ax; y、z采用默认值,即y=7; z=2*nPlus(a, ,c); /参数匹配:通过匹配实参和形参,找到参数个数及类型完全一致的唯一函数调用。若匹配结束找不到这样的函数,或者找到多个匹配函数,编译程序都将报错。如,【例2.21】error(“System A”)可匹配:error(char *sys, char*msg=Undefined errorn) error(char *sys, int code=0) error(char *sys, ) error(char *sys)对重载函数设置缺省参数时,要注意函数调用的二义性问题!3引用的应用引用参数 引用作为函数的参数 值传递 单向传递数据函数调用方式 指针(实参:取变量地址) 地址传递 双向传递数据 引用(实参:取变量名)l 调用形式 #include void main( )int a(5), b(8);swap(&a,&b);cout”After Swap1 a=”a”,b=”b;swap(a, b);cout”After Swap2 a=”a”,b=”b;void swap(int *x, int *y) int temp=*x; *x=*y; *y=temp;void swap(int &x, int &y) int temp=x; x=y; y=temp;引用调用过程:函数调用时,将实参变量名赋给形参的引用,即对形参引用进行了初始化操作,相当于在被调用函数中使用了实参的别名。于是在被调用函数体内,对引用变量进行的改变,实质上就是直接通过引用来改变实参的变量值。由于引用和被引用变量共享同一地址,所以,引用调用实质上是地址传递方式。所不同的是:实参对形参引用的初始化操作被当作值本身来传递,不必写取地址运算和取内容运算。因此,使用引用形参比用指针参数更直接、更方便。(优越性)引用返回值 引用作为函数的返回值l 非常有用。该函数的调用表达式可写在赋值运算符(=)的左边(称为“左值表达式”),可直接对其赋值、等操作。如:#include char &elem(char *s, int n) char *elem(.)return sn; /读取第n个字符,并返回之 &snvoid main( )char str =”VC+5.0”; char *c=elem(str,4)elem(str, 4)=6; *c=6;cout”st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论