第4章常量与引用_第1页
第4章常量与引用_第2页
第4章常量与引用_第3页
第4章常量与引用_第4页
第4章常量与引用_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

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

文档简介

1、第四章 常量与引用 学习目标学习目标 了解了解define与与const的区别的区别 掌握掌握const的不同应用的不同应用 掌握引用方法掌握引用方法 掌握引用拷贝构造函数的使用方法掌握引用拷贝构造函数的使用方法 const for(int i=0; i=100;i+) #define MAX 100 #define fun(a) a*5 int s=fun(3+5);fun(a)=3+5*5const使用方法使用方法 格式:格式: 注意:注意:l 尽量把尽量把const定义放进头文件里,由此通过包含头文件,把定义放进头文件里,由此通过包含头文件,把const定义放在一个需要放置的地方。定义放

2、在一个需要放置的地方。l 当定义一个常量当定义一个常量(const)时,必须初始化,即赋初值给它。时,必须初始化,即赋初值给它。const 类型名类型名 对象名对象名;例如:例如: const int MAX=100; int iDataListMAX; const使用方法使用方法程序设计中,如果不想改变某个数值,就应该声明它为程序设计中,如果不想改变某个数值,就应该声明它为“常量常量” 。常量的使用一是消除不安全因素,二是消除存储和读操作,使代码的常量的使用一是消除不安全因素,二是消除存储和读操作,使代码的执行效率更高。执行效率更高。例例4-1 常数组与常对象。常数组与常对象。l const

3、 int DATALIST=5,8,11,14;/合法使用,定义一个常量数组合法使用,定义一个常量数组l struct MyStructint i; int j;l const MyStruct sList=1,2,3,4;/正确,定义一个结构体正确,定义一个结构体常量数组常量数组 l char cListDATALIST1;/错误错误l float fListsList0.i;/错误错误const与指针与指针 const与指针的结合使用,有两种情况:与指针的结合使用,有两种情况:l 用用const修饰指针,即修饰存储在指针里的地址;修饰指针,即修饰存储在指针里的地址;l 修饰指针指向的对象。

4、为防止混淆使用,采用修饰指针指向的对象。为防止混淆使用,采用“最靠近最靠近”原则。原则。指向常量的指针指向常量的指针 l 定义格式定义格式 l 例如:例如:l const int *p; l int const *p; const 类型名类型名* 指针变量名指针变量名;const与指针与指针常指针常指针 l 定义格式定义格式 l 例如:例如:l int i=4;l int *const q=&i;l i=5;l *q=6;l 可以使用一个常指针指向一个变量,也可以把非可以使用一个常指针指向一个变量,也可以把非const对象变为对象变为const对对象。例如:象。例如:l int i=4

5、;l int *const p=&i; /可以用可以用const指针指向一个非指针指向一个非const对象对象l const int *const q=&i;/可以把非可以把非const对象地址赋值给对象地址赋值给const对象指针对象指针 类型名类型名* const 指针名指针名;const与指针与指针l 可以用指向字符的指针来指向字符串,例如:可以用指向字符的指针来指向字符串,例如:l char *p= “hello!”; l const char *q=hello!;/正确,非正确,非const指针,指针,const数据数据l const char *const p=“h

6、ello!”;/正确,正确,const指针,指针,const数据数据l 可以把非可以把非const数据对象地址赋给数据对象地址赋给const指针,但是不能把指针,但是不能把const对象的对象的地址赋给指向非地址赋给指向非const对象的指针对象的指针 l int i=5;l const int j=3;l int *p=&i;l /int *q=&j;/错误,把错误,把const对象的地址赋给指向非对象的地址赋给指向非const对象的指针对象的指针l int *s=(int*)&j;/强制转换,合法,但是不建议这样使用强制转换,合法,但是不建议这样使用 const与函

7、数与函数 函数与函数与const结合应用有两种方式:参数为结合应用有两种方式:参数为const类型;类型;返回值为返回值为const类型。类型。const类型参数类型参数 l 定义格式定义格式l 例如例如 void f(const int i) i+;/错误错误void f(const int* p) (*p)+;/错误错误 返回值类型返回值类型 函数名称函数名称(const 类型类型 参数名参数名, )const应用应用 const类型返回值类型返回值l 可以用可以用const修饰符修饰函数的返回值,即函数返回一个常量值,此常量修饰符修饰函数的返回值,即函数返回一个常量值,此常量值既可以赋给

8、常量值既可以赋给常量(对常量初始化对常量初始化),也可以赋给变量。,也可以赋给变量。 l 例例4-2 返回值为常量的函数返回值为常量的函数 l 例例4-3 常对象的使用常对象的使用 const在传递地址中的应用在传递地址中的应用l 在函数的实参与形参结合时的传递地址过程中,对于在被调用的函数中在函数的实参与形参结合时的传递地址过程中,对于在被调用的函数中不需要修改的指针或对象,用不需要修改的指针或对象,用const修饰是合适的。修饰是合适的。l 例例4-4 常指针使用举例常指针使用举例const与类与类在类里建立一个在类里建立一个const成员时不能赋初值,只能在构造函成员时不能赋初值,只能在

9、构造函数里对其赋初值,而且要放在构造函数特殊的地方。数里对其赋初值,而且要放在构造函数特殊的地方。 class conClass const int NUM; public: conClass();conClass:conClass():NUM(100) 错误示例:class conClass const int NUM=100;/错误 int iDataNUM;/错误 public: conClass(); const与类与类静态常量静态常量class Student static const int NUM=30; int iScoreListNUM; ; const int Studen

10、t:NUM; class Student static const int NUM; ;const int Student:NUM=30; const与类与类enum(枚举枚举) class Student enum NUM=30; int iDataNUM; public: conClass(); enum MAX=100,SUM=200,NEXT; const与类与类 常对象与常成员函数常对象与常成员函数 l const int i=10; l const conClass cTest(10); const成员函数定义格式成员函数定义格式 l 例例4-5 const成员函数与非成员函数与非

11、const成员函数使用方式比较成员函数使用方式比较 class 类名 返回值类型 成员函数名称(参数列表) const; ; 引用引用(&) 引用是引用是C+的一大特点,是支持的一大特点,是支持C+运算符重载的语法基础,运算符重载的语法基础,也为函数参数的传入与传出提供了便利。如果不想改变参数,也为函数参数的传入与传出提供了便利。如果不想改变参数,则可通过常量引用传递。则可通过常量引用传递。 引用被认为是某个变量或对象的别名,引用定义格式引用被认为是某个变量或对象的别名,引用定义格式 : 例如:例如:l int x;l int &y = x; 引用类型使用方法举例引用类型使用方

12、法举例 类型名类型名 & 引用名引用名 = 被引用的对象名称被引用的对象名称;引用引用(&)引用引用(&)像一个自动能被编译器逆向引用的常量型指针。像一个自动能被编译器逆向引用的常量型指针。使用规则如下:使用规则如下:l 当引用被创建时,它必须被初始化当引用被创建时,它必须被初始化(指针则可以在任何时候被初始化指针则可以在任何时候被初始化)。l 一旦一个引用被初始化为指向一个对象,它就不能被改变为对另一个对一旦一个引用被初始化为指向一个对象,它就不能被改变为对另一个对象的引用象的引用(指针则可以在任何时候指向另一个对象指针则可以在任何时候指向另一个对象)。l 没有没有N

13、ULL引用。必须确保引用是和一个合法的存储单元关联。引用。必须确保引用是和一个合法的存储单元关联。 l 当定义一个引用时,必须被初始化指向一个存在的对象,也可以这样写当定义一个引用时,必须被初始化指向一个存在的对象,也可以这样写 l int n;l int &m=n; l int &j; /错误,没有初始化错误,没有初始化 引用引用(&)l 为引用再提供一个引用,也是合法的,例如:为引用再提供一个引用,也是合法的,例如: l int x=5;l int &y=x;l int &z=y; 使用引用时注意:使用引用时注意:l 不能建立引用数组,例如:不能建立

14、引用数组,例如:l int iData5;l int& icData5=iData;/错误错误l 不能建立引用的引用,例如:不能建立引用的引用,例如:l int i;l int &j=i;/错误错误 引用与指针引用与指针 引用与指针有着本质的区别,指针通过变量的地址来间接引用与指针有着本质的区别,指针通过变量的地址来间接访问变量,而引用通过变量的别名来直接访问变量。访问变量,而引用通过变量的别名来直接访问变量。 例例4-9 指针和引用使用方法的对比指针和引用使用方法的对比例例4-10 数组、指针和引用的使用方法对比数组、指针和引用的使用方法对比 引用与函数引用与函数 采用引用的

15、主要用途之一就是做函数的参数使用。首先看一则采用引用的主要用途之一就是做函数的参数使用。首先看一则经典的使用函数交换两个变量值的例子。经典的使用函数交换两个变量值的例子。 例例4-11 使用指针和引用交换对比。使用指针和引用交换对比。例例4-12 不能返回一个不存在的或已销毁的变量的引用。不能返回一个不存在的或已销毁的变量的引用。 int& tcite2() int m=2; /return m; /错误,调用完函数tcite2()后,临时对象m将 被释放,返回 值为一个空引用 static int x=5; return x;/正确,x为一静态对象, 不会随着函数tcite2()的结

16、束而结束 引用与函数引用与函数例例4-13 正确使用指针和引用做返回值的例子。正确使用指针和引用做返回值的例子。 例例4-14 对常量引用的例子。对常量引用的例子。 void t1(int&)void t2(const int&)int main() /t1(1); /错误,在函数t1()中,可以修改参数内容,而1为常量 t2(1); /正确,在函数t2()中,参数声明为常量 拷贝构造函数拷贝构造函数 不仅可以由构造函数创建对象,也可以通过已有对象创建不仅可以由构造函数创建对象,也可以通过已有对象创建新对象。新对象。例例4-15 统计类声明对象个数。统计类声明对象个数。拷贝构造函数定义格式拷贝构造函数定义格式 例例4-16 例例4-15修改的例子。修改的例子。例例4-17 跟踪程序运行时,当前跟踪程序运行时,当前Point类对象的个数。类对象的个数。构造函数名构造函数名(const 类名类名& );class A Public: A();/构造函数 A(const A&);/拷贝构造 函数 拷贝构造函数拷贝构造函数使用拷贝构造函数时注意以下问题:使用拷贝构造函数时注意以下问题: l 并不是所有的类声明中都需要拷贝构造函数。仅当准备用传值的方式

温馨提示

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

评论

0/150

提交评论