浅析C/C++中const

基本介绍

const是constant的简写,在编程语言中意为限定一个变量为只读

C中const

1、修饰普通变量

const int num = 100;
num = 200//编译器报错,无法通过编译

在上述例子中,由于修饰整型变量num为只读,所以不能对其二次赋值,编译器会报错。
在用const修饰一个变量时,应该在声明的时候就初始化一个值,否则一旦用const声明了该变量,就不能对其进行赋值。

2、修饰数组

const int arr[] = { 1, 2, 3, 4, 5 };
arr[1] = 0;
//编译器报错,无法通过编译

使用const关键字修饰一个数组后,数组内的元素就不能被修改,否则编译器会报错。

3、修饰指针
(1)、修饰*p,指针指向的内容只读,指针的指向可以更改

int arr[] = { 1, 2, 3, 4, 5 };
const int* p = arr[0];
*p = 0; //操作错误,不能更改指针指向的内容
p = &arr[4]; //操作无误,可以更改指针的指向

在这里插入图片描述

(2)、修饰p,指针指向的内容可以改变,指针的指向不能更改

int arr[] = { 1, 2, 3, 4, 5 };
int* const p = arr[0];
*p = 0; //操作无误,可以更改指针指向的内容
p = &arr[4]; //操作错误,不能更改指针的指向

在这里插入图片描述

(3)、同时修饰,指针指向的内容不可以改变,指针的指向也不能更改

int arr[] = { 1, 2, 3, 4, 5 };
const int* const p = arr[0];
*p = 0; //操作错误,不能更改指针指向的内容
p = &arr[4]; //操作错误,不能更改指针的指向

在这里插入图片描述
助记:
const放在解引用操作符*的左侧任意位置,限定了该指针指向的对象是只读的;const放在解引用操作符的右侧,限定了指针本身是只读的,即不可变的
4、修饰函数参数
在很多库函数的定义中,都使用到了用const修饰的参数,例如:

int printf( const char *format, … );
int scanf( const char *format, … );

而在我们自定义的函数中,对于在函数体内不进行修改的参数时,可以使用const进行修饰

#include<stdio.h>
void Print(const char *str)
{
    str[0] = 'H';
    printf("%s\n",str);
}
int main(void)
{
    char str[] = "hello world";
    Print(str);
    return 0;
}

在上述例子中,我们不希望传入Print中的参数被修改,所以用const对其进行修饰,保证该变量不会因为意外而被修改。若在函数体内强行修改,则会报错
因此,在实际编程中,若在函数体内不会对参数变量进行修改,建议加上const对该变量进行修饰,使之更加安全。

5、修饰全局变量
总所周知,使用全局变量不安全,因为程序的任意一个模块都可以对该全局变量进行修改,但如果用cosnt修饰该全局变量,就可以避免这种情况的发生
具体用法:在一个文件中定义,其他文件中使用外部声明

//a.h
const int ARR[] = { 1, 2, 3, 4, 5 };
//a.c
extern const int ARR[];  //这里不能再对ARR进行赋值,后面可以直接使用

C++中const

C++中沿用C中const的用法,并在此基础上,对其进行一定的扩充
此处对cosnt修饰的类成员进行一定的说明
1、cosnt修饰成员变量
const修饰类的成员变量,表示成员常量,不能被修改,并且只能在成员函数的初始化列表中初始化

class Stu
{
    ...
    const char* _name;
    const int _age;
    ...
    Stu(const char* name, const int age)
        :_name(name)
        ,_age(age)
    {}
    ...
}

2、const修饰成员函数
const修饰类的成员函数,实际修改该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改

class Stu
{
    ...
    void displayStu()const  //<-->void displayStu(const Stu* this)
    {
        cout << _name << " " << _age << endl;
    }
    //等价于
    //void displayStu(const Stu* this)
    //{
    //    cout << this->_name << " " << this->_age << endl;
    //}
    ...
    
}

3、const修饰对象 / 对象指针 / 对象引用
const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样

若要了解具体const的总结,参见eric_jo----关于C++ const的全面总结


THE END

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值