面向对象程序设计中使用const实现数据保护
2018-01-04韩祥波
韩祥波
摘要:探讨了const在常数组、常对象、指向对象的常指针、指向常对象的指针、常引用、常对象调用常成员函数等方面的案例,通过在计算机专业和卓越班的面向对象程序设计课程中多次教学使用,较好的提高了学生的编程积极性。
关键词:C++;const;常对象;常成员函数;教学实践
中图分类号: G642.0 文献标识码:A 文章编号:1009-3044(2018)30-0070-01
1 引言
在教学过程中经常遇到学生对c++关键词const困惑的情况:const是什么、为什么用、如何用、在使用时前后有哪些限制?诸如此类的小问题影响了不少对关键知识点的理解,本文将对此探讨求解。
2 教学实践
2.1 用const 定义常量
最初引入const关键词 的目的是为了取代预编译指令,但只是形式上的替换有不少的缺陷,如:int a=1,b=2; #define x a+b 計算x*x得到结果是5而不是9。对于程序中经常使用的需要共享、又需要防止改变的数据const 类型常量。如const int x=9。 定以后任何对x的改写都是错误的。
2.2 const修饰常数组
void f(const int s[], int x) {for ( int i = 0; i < x; i++) cout << s[i] << " ";}
上述代码对数组进行const修饰后不可以在循环体内对数组改写。若循环体中添加注释行s[i]++;则因常数组不可更改而报错。
2.3 const修饰常对象及常对象成员
class Cobj {public:Cobj(int x) :m1(x){} int m1; };
int main(){ const Cobj t1(10); t1.m1=12; return 0}
若t1(10) ; 改为const Cobj t1(10);则因常对象成员不可改写而报错。
class Cobj {public:
Cobj(int x) :m1(x){}
const int m1;void show() {cout< void show(Cobj t) {cout< int main(){ Cobj t1(10); cout< show(t1); return 0;} 类中的常成员m1可以被类内外的同名show()函数访问,但在两个函数任一个的函数体内修改m1的值,都因m1的const性而报错。故类的常成员初始化只能在构造函数初始化表中进行即Cobj(int x) :m1(x){}语句。 2.4 const修饰指向对象的常指针 class Cobj {public:Cobj(int x) :m1(x){} int m1; }; int main(){ Cobj t1(10),t2(20); Cobj * const p=&t1;; p->m1=12; return 0;} 上述代码中使用了指向普通对象的常指针,初始化必须在定义时完成,可以改变对象的成员值,但不能让该指针再次赋值,如添加p=&t2;则报错。 2.5指向常对象的指针变量 class Cobj {public:Cobj(int x) :m1(x){} int m1;}; int main(){ const Cobj t1(10); const Cobj * p=&t1;; cout< 上面使用了指向常对象的普通指针,但定义该类型指针时const不能省略,否则因指针类型不对而编译报错,即使常对象对成员进行了保护。 2.6 const修饰对象的常引用 class Cobj {public:Cobj(int x):m1(x) {}int m1;}; int main(){ Cobj t1(10); const Cobj & r=t1; cout< 上面用到了对普通对象的常引用,实现了只读不写保护对象的目的,故添加r.m1=12的代码会编译报错。引用的本质是对已知变量的别名,不必建立实参的拷贝,不开辟新的内存空间,减少了内存开销,提高了运行效率,但初始化只能在定义时进行。 2.7 常对象调用常成员函数 class Cobj {public:Cobj(int x):m1(x) {}int m1; void f1(const Cobj * p)const{cout< int main(){ const Cobj t1(10); t1.f1(&t1;); return 0;} 上面常对象调用员函数时只能调用常成员函数,若f1函数的修饰词const删掉则变成普通成员函数而编译报错。同时f1的形参表中的const也不可删掉,即使函数体无改变对象成员值的意图也不可。由于成员函数声明的是常成员函数,故函数体中也不可改写成员值。上述三种情况任一种出现都会编译出错。调用对象或实参为const性质时,无论函数体内是否想改写,形参必须为const修饰。 3 结论 恰当的在全局和局部变量、形参和实参、类和对象等,利用const特性可以实现保护和开放的有效平衡,即方便的读取了数据,又进行了保护,配合引用类型的使用较好的提高了程序的效率。 参考文献: [1] 柴小伟.大数据时代下计算机网络信息安全[J].计算机与网络,2016(17):52-53. [2] 宋海玉,李锡祚,王玲芬,等. 面向对象程序设计课程建设的探索与实践[J].计算机教育,2009(5):91-94. [3] 夏承遗,李文杰,孙世温. 问题驱动的“C++ 程序设计”教学方法研究[J].计算机教育,2010(1):122-125. [4] 钱能.C++程序设计教程[M].北京:清华大学出版社,1999. 【通联编辑:王力】1