常量综述(三)

本文详细介绍了C++中const特性的使用方法及其意义,包括const对象和成员函数的定义与调用,按位const与按逻辑const的区别,以及如何通过mutable关键字允许const成员变量的更改。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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、付费专栏及课程。

余额充值