《C++ Primer Plus》简单理解const关键字

前言

        前不久首次遇上了const,const在《C++ Primer Plus》一书目录中出现过两次,分别与“指针”(第七章)、"对象"(第十二章)共同出现过。这让我非常疑惑,难道没有一个特定的小节专门来介绍const关键字?有时间从头到尾阅读一篇此书,一定要把它揪出来!

        特别声明:由于本人写作水平相比于原作者还是有所不如,所以暂时在前几篇文章中,我会大量使用原文中的内容。


《C++ Primer Plus》简单理解const关键字

const关键字

一、解释

二、const 修饰指针变量。

1.1 第一种办法是:让const修饰的指针指向一个常量对象,这样可以防止该指针来修改所指向的值

1.2 第二种办法是:将指针本身声明为常量,这样可以防止改变指针指向的位置。

二、const修饰普通类型的变量

三、const参数传递和函数返回值。 


const关键字

一、解释


        const 是 constant 的缩写,本意是不变的,不易改变的意思。在 C++ 中是用来修饰内置类型变量自定义对象成员函数返回值函数参数

        C++ const 允许指定一个语义约束,编译器会强制实施这个约束,允许程序员告诉编译器某值是保持不变的。如果在编程中确实有某个值保持不变,就应该明确使用const,这样可以获得编译器的帮助。

二、const 修饰指针变量。


        注:关于const修饰指针变量内容位于《C++ Primer Plus》一书中第七章的7.3.5 指针和const(P182)。

        将const用于指针有一些很微妙的地方,我们可以用两种不同的方式将const用于指针:

1.1 第一种办法是:让const修饰的指针指向一个常量对象,这样可以防止该指针来修改所指向的值

int age = 39;
const int * pt = &age;

        该声明指出,pt指向一个const int(这里指39这个int值),因此不能使用pt来修改这个值。换句话来说,*pt的值为const,不能被修改。

*pt += 1; //不合法的,因为pt指向了一个const int
cin>>*pt; //不合法的,和上面的原因一样

        现在来看一个微妙的问题。pt的声明并不意味着它指向的值实际上就是一个常量,而只是意味着对pt而言,这个值是常量。例如:pt指向age,而age不是count。可以直接通过age变量来修改age的值,但不能使用pt指针来修改它;

*pt = 20; // 不合法的,因为pt指向了一个const int
age = 20; //  合法的,因为age没有被const修饰

        以前我们将常规变量的地址赋给常规指针,而这里将常规变量的地址赋给指向const的指针。因此还有两种可能:1、将const变量的地址赋给const的指针;2、将const的地址赋给常规指针.这两种操作都可行吗?实际上第一种可行,第二种不可行。

const float g_earth = 9.80;
const float * pe = &g_earth; // 合法

        对于第一种情况来说,既不能使用g_earth来修改值9.80,也不能使用pe来修改。 

const float g_moon = 1.63;
float * om = &g_moon; // 不合法

         C++禁止第二种情况的原因也很简单——如果将g_moon的地址赋给pm,则可以使用pm来修改g_moon的值,这使得g_moon的const状态很荒谬,因此C++禁止将const的地址赋给非const指针。

        如果非要这样子去做,那么可以使用强制类型转换来突破这种限制。

1.2 第二种办法是:将指针本身声明为常量,这样可以防止改变指针指向的位置。

pass


二、const修饰普通类型的变量


const int  a = 7; 
int  b = a; // 正确
a = 8;       // 错误,不能改变

        a 被定义为一个常量,并且可以将 a 赋值给 b,但是不能给 a 再次赋值。对一个常量赋值是违法的事情,因为 a 被编译器认为是一个常量,其值不允许修改。


三、const参数传递和函数返回值。 


对于 const 修饰函数参数可以分为三种情况。

A:值传递的 const 修饰传递,一般这种情况不需要 const 修饰,因为函数会自动产生临时变量复制实参值。

void Cpf(const int a)
{
    cout<<a;
    // ++a;  是错误的,a 不能被改变
}

B:当 const 参数为指针时,可以防止指针被意外篡改。

#include<iostream>
using namespace std;
 
void Cpf(int *const a)
{
    cout<<*a<<" ";
    *a = 9;
}
 
int main(void)
{
    int a = 8;
    Cpf(&a);
    cout<<a; // a 为 9
    system("pause");
    return 0;
}

C、

pass 

猜你喜欢

转载自blog.csdn.net/qq_51831335/article/details/127482868
今日推荐