用好c++ 的cot_C/C++语言_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

用好c++ 的cot

作者:黑客防线网安C/C++教程基地 来源:黑客防线网安C/C++教程基地 浏览次数:0

本篇关键词:可以变量成员修改
黑客防线网安网讯:   const是c++当中很有特色的一个语言功能,它限制了对数据的操作,还限制了类成员函数的行为,而且是对c++的引用类型的函数参数和返回值这个功能的有益补充,c++程序员应该时时有意识地正...

   const是c++当中很有特色的一个语言功能它限制了对数据的操作还限制了类成员函数的行为,而且是对c++的引用类型的函数参数和返回值这个功能的有益补充,c++程序员应该时时有意识地正确使用const关键字const对于变量来说,是一个要求,而对于函数来说,是一个承诺,对它所操作的变量的承诺由于const的使用场合和使用对象很多,要正确地使用它还是需要用一番心思的。

  const在一下一些地方使用:
首先它可以修饰一个变量,此时这个const是这个变量的一个要求---它不可以被修改,所以这个变量必须在初始化的时候被赋值,初始化之后就不能赋值了,是一个只读的变量,见本文末尾的例子(2)。这意味着它不可以以任何方式被赋值,包括不能做赋值表达式的左值,同时不可以把它传递给那些没有承诺不更改它的值的函数。

  那么函数怎么做这个承诺呢,看第五段。如果一个int类型变量i是const的,那么它的地址&i也是const的,从(3)中可以看出,&i只能赋值给const的指针变量p而不可以赋值给q,因为我们可以通过赋值给*q而更改它所指向的变量i. 从这里我们可以看到,上述声明表示我们不可以通过p修改它所指向的变量的值,也就是说*p也是一个常量了,所以 *p = 5 这样的表达式是错误的(4)。要注意的是, p作为一个变量,它自身是可以修改的(6),p的声明当中的const要求不可以通过p更改它所指向的值,是p对它所指向的变量的承诺。当它所指向的变量不需要这样的承诺时,p自然仍然可以指向那个变量(6),但是(7)仍然是错误的,因为p有承诺不可以改变它所指向的变量的值。另外,如果我们想要求p指针变量自身也不可以修改,那我们应该如(9)中所做,并且注意此时r必须在初始化时候赋值,否则它就不可能再被赋值了(10)。而从(11)中我们可以看出,指针变量k要求它自身是只读的,但是没有承诺不可以通过它来修改它所指向的变量,因而不可以把&i赋值给它。

  当一个对象实例被const修饰后,它自身的状态在初始化之后就不可以修改了,这时候不仅上面的约束必须成立,而且我们不可以调用它的成员函数,因为它的成员函数可能会修改它的状态,除非那个成员函数承诺不会修改this对象的状态。而承诺的方式至少是在函数签名末尾加上"const",如(12)所示。而如果这个函数要返回一个非mutable的数据成员的引用的话,那么返回类型必须加上const表示那个返回的引用不可以被用于修改对象的状态,这样这个成员函数才完整地承诺了它不会被用于修改对象的状态(13),否则,就不可以说它是一个常量成员函数(14)。事实上,如果一定要返回数据成员的引用(比如拷贝构造的代价很大时),那么强烈建议返回const引用,以便禁止修改这个数据成员,否则将严重违反类的封装性,这种违反可能带来暂时的编码方便性,但是长期来看,一定会吃苦头的。

  注意在(12)中,虽然返回了数据成员message_,但是我们返回的是它的一个copy而不是那个对象自身,所以get_message()函数不可能被用于修改message_数据成员,而(12.1)错就错在它返回了message_的引用。

  那么什么是一个对象的状态呢,默认是这个对象的所有数据成员,但是在有一些情景下,一个对象的某些成员变量可能对于它的状态没有决定作用,这完全决定于类的设计者。如果类Foo中有这样的成员变量的话,我们需要把它声明为mutable,表示即使一个Foo的实例是常量,我们也可以修改这个成员,同理,类 Foo的那些承诺不修改对象状态的函数也可以修改这个成员变量(12)。类当中也可以有const的数据成员,它也像独立的const变量一样,完全不可以以任何方式修改它的值,所以它必须在类的构造函数的初始化列表中被初始化,在构造函数体中初始化是不可以的(15)。

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-15211-1.html
网站维护教程更新时间:2012-04-04 22:51:40  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer