常量综述(三)

const对象和成员函数
      用户定义类型和内部类型一样,都可以定义const对象,比如
             const  Hony h(3);
        对于const成员函数,就是告诉编译器该成员函数可以为一个const对象所调用,当然非const对象也能调用。然而这就出现个问题怎么声明const成员函数,这里用了个新的语法形式,把修饰符const放在函数参数表的后面。

 

class  X
{
           
int  i;
      
public :
           X(
int  ii);
           
int  f()  const ;          // const成员函数
};

X::X(
int  ii):i(ii) {}
int  X::f()  const  {  return  i; }

int  main()
{
      X x1(
10 );
     
const  X x2( 20 );    
     x1.f();         // 非const对象也能调用const成员函数
     x2.f();
}

        注意,关键字const必须用同样的方式出现在定义里。const成员函数就认为在这个函数里面不会修改任何数据成员,所以它满足const对象的意义。但是对于普通的成员函数就没有这个假定,这时const对象调用这种函数就会出错。而且规定const对象只能调用const成员函数。

 按位const和按逻辑const
               按位const意思是对象中的每个字节都是固定的,所以对象的每个位映像从不改变。
               按逻辑const意思是,虽然整个对象从概念上讲是不变的,但是可以以成员为单位改变。
  对于第一种,有两种方法可以改变成员数据,一是"强制转换常量性",二是用C++的关键字const_cast<typeid>

 

class  Y
{
        
int  i;
    
public :
        Y();
        
void  f()  const ;
};

Y::Y() { i
= 0 ; }
void  Y::f()  const
{
       i
++ ;      // error 
       ((Y * ) this ) -> i ++ ;       // OK 强制转换常量性
      (const_cast < Y *> ( this )) -> i ++ ;      // C++中支持的常量安全转换
}

int  main()
{
       
const  Y y1;
       y1.f();
}

      不过这两个办法都是隐藏在类里面的,用户无法看到数据的改变。对于第二种按逻辑const,需要改变的数据成员使用关键字mutable,以指定一个特定的数据成员可以在一个const对象里面被改变。

 

class  Z
{
       
int  i;
       mutable 
int  j;
   
public :
       Z():
       
void  f()  const ;
};

Z::Z():i(
0 ),j( 0 ) {}
void  Z::f()  const
{
     i
++ ;        // error
     j ++ ;        // OK
}

int  main()
{
     Z z1;
     z1.f();
}

 volatile
   这是C++关于常量的另一个关键字,volatile的意思是"在编译器认识的范围外,这个数据可以被改变"。它告诉了编译器不要做出有关该数据的任何假定,尤其是优化方面的。但这个关键字现在用的很少,主要是多线程,分布式程序里面会起作用。

 

结语:
      关于C++中常量的概念这里就全部讲完了,希望对大家有一定的帮助。在写大点的程序时,类里常量的作用会慢慢体现出来的,不过很多还是语法层面上的东西,记住了就没太多的问题了。常量本质含义还是很基础的:程序运行开始后(或者编译后)就不能改变的变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值