关于C/C++中const的用法

const是一个修饰符,修饰变量,被他修饰的变量只可读取,不能修改。

一.const与define的区别

在c中,我们经常使用define来定义一个常量,但在c++中我们通常使用const,且这种较稳定

1.const变量有数据类型,而define无数据类型,这样就会导致在C++中使用重载函数时产生一些歧义。

2.const变量具有作用域,而define无作用域,从开始定义到此文件结束都是有效的

二.C和C++中const的区别

首先谈谈在两种语言下他的区别。

C 中的 const 变量,在定义时,则会在内存中创建空间, 而 c++ 不会创建,只有取一个 const 地址 , 或者把 它定义为 extern, 则会为该 const 创建内存空间。

三.具体谈谈在C++中const的用法

1.const初始化值为常量

大家先狠狠的看一下这个代码并且思考一下这个输出结果是什么
现在我给大家解释一下这个输出结果:
刚才说到在C++中const不分配内存空间,那么第四行代码说的其实是将constA导入到这个符号表当中,那符号表肯定是不能改变的所以是非常稳定的。(如上图所示)
这个第五行就说明,此时为constA分配了内存空间,因为已经使用了取地址符,这时候p指向新为constA开辟的内存空间, 这里稍微解释一下为什么&constA前面有个(int*),因为在c++中是需要强制类型转换的,但在c语言中就不一定了,如果不强制类型转换,此时是属于const int*,是不合适的。

为什么输出结果*p变了而constA没变就是因为*p=20;只是代表将p指向的这片内存空间的值替换成了20,但是我们constA的值仍然是从符号表中取得的。

2.const变量初始化为一个变量

这种情况下就不存在符号表这种说法了,在第五行代码执行时,编译器直接就为我们的constA分配了内存空间,那既然此时不存在符号表这种稳定的事情,那么这时候的输出结果是什么呢

此时,在经历*p=20;后两者的值都被更改了,因为p所指向的那片内存空间的值被更改了,此时的constA的值仅仅来源于那片内存空间。这也是我们说的通过指针间接修改const的值。

3.常引用

const 类型& 引用名

4.const与指针一起使用时的用法

4.1指向常量的指针

const char *name="chen";

此时指针是一个变量,它可以指向任意的地方,但一旦他指向一个地方,那么这个地方的值是不可以修改的

name可以最开始指向chen,也可以指向liu但他指向chen的时候,不可以将chen中的n改为y

4.2常指针 

char*const name、="chen";

此时指针指向的地址不可以更改,但是这片地址里面的值是可以更改的

此时,name首次指向chen,那么就不能再指向liu,但是它可以将chen中的n改为y。

这里就不得不提到上次说的引用了,其实引用和他的效果一致,但是引用是不再分配内存空间的,他与他的本体(int&j=i;)也就是j和i共用一片内存空间,这样来说肯定是效率更高的啦

4.3.指向常量的常指针

const char*const name="chen";

这个就属于前两种的结合,既指向的地址不能更改且地址中的值也不可以更改

5.关于类中的一些const

5.1常对象

  用const修饰说明的对象为常对象

   格式: 类名 const 对象名[(参数表)]; 或   const 类名 对象名[(参数表)];

#include <iostream>

using namespace std;
class A
{
public:
    int x;
    mutable int y;
    A() {
        x = 100;
        y = 0;
    }
    A(int _x,int _y) {
        x = _x;
        y = _y;
    }
    void setXY(int x, int y) const
    {
        // this->x = x; // error
        this->y = y;
    }
    void show()const
    {
        cout << x << "," << y << endl;
    }
    void hello() {
        cout << "hello" << endl;
    }
};

int main(int argc, char const* argv[])
{
    A a1;
    a1.setXY(1, 2); // const函数,内部不修改非mutable的成员变量
    a1.show();

     //const A a2; //报错 error ,const 变量必须存在初始值(右值)
    const A a2 = A();
    a2.y = 10;//此时a2中y的值变成10
    a2.setXY(0, 30); //此时a2中y的值变成30,x的值未发生变化
    a2.show();  // const对象可以访问const的成员函数
    //a2.hello;// const对象不能访问非const成员函数
    return 0;
}

注释:(通过上述代码可以总结出)

1.在定义对象时必须进行初始化,即const 变量必须存在初始值(右值)

2.常对象只能调用它的常成员函数,而不能调用普通的成员函数。

3.可以看到a2是一个常对象,他是不可以更改他的数据成员的(间接直接都不可以),但可以修改mutable修饰的成员变量(即y这个变量)。  

5.2常成员函数

  • 28
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值