首页 > 编程语言 >C++ 中 const 关键字的作用总结

C++ 中 const 关键字的作用总结

时间:2022-10-20 22:32:45浏览次数:49  
标签:const 常量 对象 成员 C++ 关键字 修饰 指针

const 的含义

相信大部分程序员都对 const 不陌生,英文翻译中作为形容词意思为恒定的,不变的,作为名词翻译为常量,恒量,其实,这在很大程度上已经说明了这个关键字的含义。接下来,让我们看看在 C++语言中,const 关键字修饰不同的类型时,它的具体含义是什么。

const 在 C++中修饰不同类型数据时的含义

核心要点:const 修饰标识有某些东西不可被改变

const 修饰基本数据类型

基本数据类型,修饰符 const 可以用在类型说明符前,也可以用在类型说明符后,其结果是一样的,说明这些变量只读不可改变。如:

//两者含义相同
const int test_value1 = 1;
int const test_value2 = 2;
test_value1 = 3; //这种操作是违法的,是不被编译器允许的,试图修改一个不可修改的变量

const 修饰指针变量和引用变量

如果 const 位于的左侧,则 const 就是来修饰指针所指向的变量,即指针指向为常量;如果 const 位于的右侧,则 const 就是修饰指针本身,即指针本身是常量。如:

const int *p1; //说明p1指向的变量为常量,这个变量不可更改,但p1的值是可以更改的
int *p1 const; //说明p1本身为常量,不可更改
const int *p1 const; //说明p1本身和其指向的变量都是常量不可更改,但是一般不会这么使用
//参考C++ primer中的方法,我们可以通过从右向左读的方式来确定类型的意义,将const * & 都视作修饰符
//比如,从右向左,第一个是const,说明pip是一个常量对象,*说明pip是一个常量指针,double说明pip指向的对象类型为double,最后const说明这个指向的对象是常量
const double *const pip = 0;

const 修饰函数参数

调用函数的时候,用相应的变量初始化 const 常量,则在函数体中,按照 const 所修饰的部分进行常量化,保护了原对象的属性,即不可更改传入的参数,只读。注意:参数 const 通常用于参数为指针或引用的情况。如:

//打印输入的vector元素
void printVector(const std::vector<int> &inputNums){
for(auto &i : inputNums){
std::cout << i << " ";
}
std::cout << std::endl;
}

const 修饰类成员变量

const 成员变量,只在某个对象生命周期内是常量,而对于整个类而言是可以改变的。因为类可以创建多个对象,不同的对象其 const 数据成员值可以不同。所以不能在类的声明中初始化 const 数据成员,因为类的对象在没有创建时候,编译器不知道 const 数据成员的值是什么。const 数据成员的初始化只能在类的构造函数的初始化列表中进行。

const 修饰类成员函数

const 成员函数的主要目的是防止成员函数修改对象的内容。要注意,const 关键字和 static 关键字对于成员函数来说是不能同时使用的,因为 static 关键字修饰静态成员函数不含有 this 指针,即不能实例化,const 成员函数又必须具体到某⼀个函数,实际上,const 成员函数还是普通的成员函数,知识不能修改对象中的成员变量内容,所以还是需要借助对象的 this 指针进行访问。const 成员函数中如果实在想修改某个变量,可以使用 mutable 进行修饰。成员变量中如果想建立在整个类中都恒定的常量,应该用类中的枚举常量来实现或者 static const。

const 修饰类对象

常量对象:常量对象只能调用常量函数,别的成员函数都不能调用。

C++对象调用成员函数时,在形参列表的最前面加⼀个形参 this,但这是隐式的。this 指针是默认指向调用函数的当前对象的,所以,this 指针的类型就应该是 Type *const this,不可更改指针本身。

对于常量对象,这里增加的隐式 this 指针就指向了一个常量对象,该对象的内容不可被修改,所以隐式 this 形参为 const Type *const this,即不可以通过 this 指针来改变指向对象的值,因此也就只有 const 成员函数可以被调用了。

非常量对象可以调用类中的 const 成员函数,也可以调用非 const 成员函数。


标签:const,常量,对象,成员,C++,关键字,修饰,指针
From: https://blog.51cto.com/u_15830688/5780631

相关文章

  • 继承——super关键字
    在子类中使用super调用父类的方法定义一个父类Personpackagecom.kuangstudy.Demo06;publicclassPerson{protectedStringname="kuangshen";} 使用子......
  • 实验3 数组、指针与现代C++标准库
    实验任务五:Info.hpp:#pragmaonce#include<iostream>#include<string>#include<iomanip>usingnamespacestd;classInfo{private:stringnickname,cont......
  • C++类模型漫谈(三)
    系统基于32位,MSVC编译器,VS开发工具1、上篇直接通过类型对象调用成员函数,这种方式无法实现多态。所谓多态意思对函数的调用呈现出不同的形态。下面这个例子中a_ptr为指向......
  • 实验3 数组、指针与现代C++标准库
    实验5#pragmaonce#include<iostream>#include<string>#include<iomanip>usingnamespacestd;classinfo{public:info(stringnickname0,stringcontact......
  • 项目开发神器VsCode配置指南!(含C++、Python、Java环境配置)
    作者:吴忠强,东北大学,Datawhale成员本篇文章虽然是VsCode挂名,但其实介绍了两款神器:Vscode和Vim,这两个结合起来,开发效率蹭蹭蹭!!!之前接触过VsCode但很少用。总感觉写Python......
  • Java关键字(二)——native
    本篇博客我们将介绍Java中的一个关键字——native。native关键字在JDK源码中很多类中都有,在Object.java类中,其getClass()方法、hashCode()方法、clone()方法......
  • #打卡不停更#三方库移植之NAPI开发[2]C/C++与JS的数据类型转换
    在《三方库移植之NAPI开发[1]—HelloOpenHarmonyNAPI》通过一个HelloOpenHarmonyNAPI样例讲述了NPAI接口开发基础知识。本文在其基础上修改hellonapi.cpp文件,介绍JS类型......
  • C++ 值,指针,引用的讨论
    源自stackoverflow论坛,很有意义第一个问题,引用传递和按值传递的场合Therearefourmaincaseswhereyoushouldusepass-by-referenceoverpass-by-value:Ifyou......
  • c++ list插入
    list::insert()用于在列表的任何位置插入元素。用法:insert(pos_iter,ele_num,ele)参数:此函数接受三个参数:pos_iter:在容器中插入新元素的位置。ele_num:要插入的......
  • JKD1.5之后利用关键字Enum来创建枚举类
    JDK1.5之后使用Enum关键字创建枚举类 变成下面的枚举类 packagecom.msb.enum02;/***开发人:liu*日期:16:01:37*描述:定义枚举类:季节*版本:1.0*/......