专栏名称: strongerHuang
公众号作者『strongerHuang』(黄工),分享内容包括(但不限于):Keil、IAR、STM8、STM32、μC/OS、FreeRTOS、CANOpen、ModBus...
目录
相关文章推荐
51好读  ›  专栏  ›  strongerHuang

C++与C中的const关键字有何差别?

strongerHuang  · 公众号  ·  · 2019-11-02 21:00

正文

来源: 公众号【编程珠玑】
作者: 守望先生
ID: shouwangxiansheng

前言

在《 const关键字到底该怎么用 》一文中介绍了C语言中的const关键字,本文说说C++中的const关键字,它的大部分特点和C语言中的类似,所以本文主要针对不同之处。

修饰普通变量--只读

在C语言,虽然表面是不允许被修改,但是看下面的代码:
#include 
int main(void)
{

    const int a = 10;
    int *p = &a;
    *p = 11;
    printf("a=%d\n",a);
    return 0;
}
它的输出结果是
a=11
所以C语言里,表面上它是只读的,然而你违规操作仍然能改变。 但是,千万不要写这样的代码!
与C语言中const关键字不同的是,C++中使用const关键字定义的b变量的值在被改变时会被检测。
看一个例子就明白了:
#include 
int main()
{

    const int a = 10;
    int *p = &a;
    *p = 11;
    return 0;
}
编译报错如下:
main.cpp: In function ‘int main()’:
main.cpp:5:14error: invalid conversion from ‘const int*’ to ‘int*’ [-fpermissive]
     int *p = &a;
再次强调:在 实际中千万不要写这样的代码 ,这里只是为了说明问题。另外它们的作用也是一样的, 声明一个只读变量,不希望被修改,一旦被修改,编译器将会报错。
但是你运行下面的代码,又会有惊喜:
#include
void test(const char* str)
{
    char *p = (char*)str;
    p[0] = '2';
}
int main(void)
{
    char a[] = "12345";
    test(a);
    return 0;
}
毕竟未定义行为常常有惊喜。
我们常常看到传递const char*参数,像这样:
void test(const char* str);
却似乎从来没有见到过const int作为参数的函数:
void test(const int val);
为何? 因为前者传递指针的副本,指针指向不会被改变,但可以改变指向的内容; 但是int类型参数,它也是传递副本,但是永远不会被函数改变,自然也没有必要加const关键字。 更多解释可以参考《 传值和传指针 》。
同样的,修饰函数返回值时,修饰内置类型与不加const修饰是一样的,但对于自定义类型,不能对返回值进行修改,即返回的是常量。

作用在成员函数-不改变成员变量

举个例子:
#include
class Test
{

private:
    int a;
public:
    void printA() const
    
{

        a = 10;
    }
};
int main()
{

    Test test;
    test.printA();
    return 0;
}
类test中有一个成员变量a,并且有一个成员函数printA,现在假设 你的设计是printA函数不会改变任何成员变量,那么你可以在printA函数后加上const关键字,这样一旦函内部尝试修改成员变量,都会报错
main.cpp: In






请到「今天看啥」查看全文