《Chap2从C快速过渡到C》由会员分享,可在线阅读,更多相关《Chap2从C快速过渡到C(26页珍藏版)》请在金锄头文库上搜索。
1、Chap2 C+的变量、类型及函数(从 C 快速过渡到 C+)本章内容:2.1 数据类型2.2 声明及定义2.3 C+的常量与变量2.4 C+的指针2.5 引用类型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
2、”; 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 Type ADT)常量(只读变量)C+保留了 C 的常量定义风格,且对它的符号常量加以扩展。如#define tab
3、size 4 const int tabsize=4;#define PI 3.1415926 const float PI=3.14159262.2 声明与定义声明:对某个名及其内涵的不完整描述定义:对该名及其内涵的完整描述变量声明:不分配存储单元 或 不初始化的变量定义。如,extern int i; /声明extern int i=0; /定义函数声明:不定义函数体的函数原型描述。如,long sum(int a, int b); /声明long sum(int a, int b) /定义 return a+b; 注意:对于未初始化的全局变量、静态变量,C/C+缺省地初始化为 0(定义)
4、对于局部变量,C/C+都不会缺省初始化(声明)2.3 C+的常量与变量2.3.1 常量(只读变量)常量:在程序运行期间其值不能被修改,在定义时必须初始化C+对符号常量加以扩展,对任何类型的对象(指针变量、引用变量、结构变量、数组、class类型的对象)都可以定义成常量。定义格式: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结构变量 struc
5、t ComplexC 与 C+在声明和定义时的不同:C 语言:一般只允许以常量表达式初始化变量,局部非静态变量可以用任意表达式初始化。变量声明和定义必在语句前。C+语言:所有变量都可以用任意表达式初始化。变量声明和定义不必在语句前。兼容 C,局部非静态变量如不初始化,则其值不确定。常量表达式:编译时可计算出常量值。如:3,3.14*3*3,size 2,sizeof(int2),sizeof(3+printf(“ABC”)任意表达式:常量、变量、函数调用等组成。只能在运行时计算出值。如:常量表达式A,3+Aprintf(“ABCDEF”)3+ printf(“ABCDEF”)注意:int2是类
6、型表达式,而非值表达式。值表达式包括常量表达式和任意表达式。值表达式又可分为左值或右值表达式。double real;double image;const Complex X=1.0, 1.0;X.real=2.0; /错误X.image=3.0; /错误4指针 将指针所指的目标变量定义成只读 指向常量的指针定义格式:const 类型 *指针名地址表达式;/ .可选 ?类型 const *指针名;例:const char *pc=”abcd”; / *pc 为只读变量,不可变pc3=f; / *pc=a; / const char *pc; pc=”abcd”;pc=”sdef”; / 指针所
7、指存储单元的值是不可变,而指针的地址值是可以改变(即,可以重新给指针定向) 。即,*pc,*(pc+1),.,pc0,pc1 ,. 不可重新赋值pc 可重新赋值将指针本身定义成只读 常量指针定义格式:类型 *const 指针名地址表达式; /必须在定义同时初始化例:char * const pc=”abcd”; / pc 不可变,*pc 可变pc3=f; /pc = “sdef”; / 指针所具有的地址值不可变,而指针所指存储单元的值是可以改变。即, pc 不可重新赋值*pc,*(pc+1),.,pc0,pc1 ,. 可重新赋值指针和其所指对象同时定义为常量 指向常量的常量指针定义格式:con
8、st 类型 * 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 int *const 指针 *const p; cpi=&i;2.3.2 变量保留了 C 定义变量方
9、式,新增:1基本类型(BDT )变量初始化方法例: int i=6; int i(6);char c=a; char c(a);格式:BDT 变量名(初始值) ; BDT 变量名=初始值;2变量只要在使用之前定义 or 声明即可,不必集中在作用域的开头和执行语句之前3作用域运算符 :若全局变量与局部变量同名,则在局部变量的作用域内同名的全局变量被隐藏起来。C 无法访问同名的全局变量,即不可见。C+,用:访问被隐藏的全局变量,解决了同名冲突问题。例:#include /C+输入/输出流库 stdio.hint x=6; void main( )int x=1;cout程序不能往任意类型不确定的存
10、储单元赋值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)并不是指针变量存储空间为空,而是有特定的值(0) ,类似于数学上的零矢量,其长度为 0 而指向是任意的。程序中应尽量避免使用空指针2.5 引用变量(简
11、称“引用” )引用就是给变量取一个别名,即:新变量与原变量共享一个地址,具有相同的值。是 C+的一种特殊类型的变量,既不同于普通变量,也不同于指针变量定义格式: DataType &引用名变量名 ; /定义同时必须初始化例: int i=50;int &ref=i; /ref 是整型变量 i 的引用,ref与 i 共享同一存储单元注:引用必须初始化,除非是用作函数参数 or 返回值;通过初始化引用,使它成为被引用对象的别名。2.5.1 引用的初始化与变量赋初值不同。其实质是靠常量指针实现的,即:用被引用变量的地址&i 来初始化常量指针&ref。因此,初始化后引用的地址值&ref 不可变,总是指
12、向被引用变量 i执行过程分析: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地址 常量指针引用与被引用变量通过地址相联系,因此,引用是指针的另一表示形式2.5.2 引用的使用说明1对引用的操作等价于对被引用变量的操作,即ref+; / i+;ref=i+2; /i=?, ref=?2可用某个引用
13、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
14、 &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+函数普通函数、友元函数、构造函数、析构函数、内联函数.任意类型的函数都可作原型声明与内联声明2.6.1 函数原型用于描述函数的参数和返回类型通过原型声明,当访问函数时,编译程序根据预先声明的函数原型对函数参数和返回类型作一致性检查(强类型语言)在原型中,可以不说明参数名,但必须定义参数类型,如double sin(double x);double cos(double );标准函数的原型声明包含在各种头文件(*.h)中,所以必须先包含相应的头文件,才能使用对应的函数。 (非标准函数用法一样)2.6.2 函数重载1引入目的:解决不同类型的对象需要完成相同or 相似的任务iPrint(int )打印整数fPrint(float )打印实数dPr