广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >详解C++ const修饰符
  • 122
分享到

详解C++ const修饰符

2024-04-02 19:04:59 122人浏览 安东尼
摘要

目录概述 常对象常对象成员常成员函数常数据成员数据成员访问限制常对象修改的限制 常指针指向常变量的指针指向对象的指针小结对象的常引用 总结概述 cons

概述

const 是 constant 的缩写, 是不变的意思. 在 c++ 中是用来修饰内置类型变量, 自定义对象, 成员函数, 返回值, 函数参数. const 可以帮我们避免无意之中的错误操作.

在这里插入图片描述

使用 const, 把有关的数据定义为常量 (常变量 / 常对象 / 常函数). const 既可以使数据在一定范围内共享, 又要保证它不被任意修改.

const 包括:

  • 常对象
  • 常指针
  • 常引用

 常对象

我们可以将需要保证数据成员不改变的对象, 可以声明为常对象. 常对象中的所有成员的值都不能被修改.

常变量的两种格式:


类名 const 对象名[(实参表列)];
const 类名 对象名[(实参表列)];

常对象必须要有初始值. 例如:


Time const t1(12, 34, 46);
const Time t1(12, 34, 46);

试图改变常对象的成员值会发生什么:


int main() {

    const Time t1(10, 10, 10);  // 定义const Time对象
    t1.set_time(2,2,2);  // 试图改变t1对象的成员数据, 报错

    return 0;
}

输出:
C:\Users\windows\CLionProjects\Project1\main.cpp: In function 'int main()':
C:\Users\Windows\CLionProjects\Project1\main.cpp:10:22: error: passing 'const Time' as 'this' argument discards qualifiers [-fpermissive]
     t1.set_time(2,2,2);
                      ^
In file included from C:\Users\Windows\CLionProjects\Project1\main.cpp:2:
C:\Users\Windows\CLionProjects\Project1\Time.h:12:10: note:   in call to 'void Time::set_time(int, int, int)'
     void set_time(int h, int m=0, int s=0);
          ^~~~~~~~
mingw32-make.exe[3]: *** [CMakeFiles\Project1.dir\build.make:81: CMakeFiles/Project1.dir/main.cpp.obj] Error 1
mingw32-make.exe[2]: *** [CMakeFiles\Makefile2:94: CMakeFiles/Project1.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles\Makefile2:101: CMakeFiles/Project1.dir/rule] Error 2
mingw32-make.exe: *** [Makefile:136: Project1] Error 2

常对象成员

常成员函数

如果我们要引用常对象中的数据成员, 就需要将该成员函数声明为 const 型函数, 即常成员函数. 常成员函数可以访问对象中的数据成员, 但不允许修改常对象中数据成员的值.

举个栗子:

Time 类:


#ifndef PROJECT1_TIME_H
#define PROJECT1_TIME_H

class Time {
private:
    int minute;
    int second;
public:
    int hour;
    Time();  // 默认构造函数
    Time(int h, int m=0, int s=0);  // 有参构造函数
    void set_time(int h, int m=0, int s=0);
    void show_time() const;  // 声明为常成员函数
};

#endif //PROJECT1_TIME_H

Time.cpp:


#include "Time.h"
#include <iOStream>
using namespace std;

// 默认构造函数
Time::Time() : hour(0), minute(0), second(0) {}

// 有参构造函数
Time::Time(int h, int m, int s) : hour(h), minute(m), second(s) {}

void Time::set_time(int h, int m, int s) {
    hour = h;
    minute = m;
    second = s;
}

void Time::show_time() const {
    cout << hour << ":" << minute << ":" << second << endl;
}

main:


#include "Time.h"
#include <iostream>
using namespace std;

int main() {

    const Time t1(10, 10, 10);  // 定义const Time对象
    t1.show_time();  // 调用常成员函数

    return 0;
}

调试输出:

10:10:10

注: const 是函数类型的一部分, 在声明函数和定义函数时都要有 const 关键字.

常数据成员

当我们用关键字 const 来声明常量数据成员, 可以限定其值不能改变.

Time 类:


#ifndef PROJECT1_TIME_H
#define PROJECT1_TIME_H

class Time {
private:

public:
    const int hour;  // 定义hour为常数据成员
    int minute;
    int second;

    Time();  // 默认构造函数
    Time(int h, int m=0, int s=0);  // 有参构造函数
    void set_time(int m=0, int s=0);
    void show_time() const;  // 声明为常成员函数
};

#endif //PROJECT1_TIME_H

因为 hour 为常数据成员, 所以我们只能通过构造函数的参数初始化表对常数据成员进行初始化.


// 默认构造函数
Time::Time() : hour(0), minute(0), second(0) {}

// 有参构造函数
Time::Time(int h, int m, int s) : hour(h), minute(m), second(s) {}

我们不能再构造函数中用赋值的方法对常数据成员初始化. 例如:


Time::Time(int h){hour=h;}  // 非法

不能用成员函数改变常数据成员的值. 例如:


void Time::setHour(int h){hour=h;}  // 非法

数据成员访问限制

常对象中的成员函数未加 const, 编译系统认为其是非 const 成员函数.

在这里插入图片描述

常对象修改的限制

如果一个对象被声明为常对象, 则不能调用该对象的非 const 型的成员函数, 除了由系统自动调用的隐式的构造函数和析构函数.

要点:

  • 编辑系统只检查函数的声明, 只要发现调用了常对象的成员函数, 而该函数未被声明为 const, 就报错
  • 防止函数修改常对象中数据成员的值
  • 编译系统对不安全的因素予以拦截, 为我们开发人员省了不少心
  • 用常成员函数引用常变量

 常指针

将指针变量声明为 const 型, 指针值始终保持为其初始值, 不能改变.

指向对象的常指针格式:


类名 *const 变量名;
Time time1(10, 12, 15), t2;
Time * const pt = &t1  // pt 是常指针
pt = &t2; // 将一个指针固定

常见用途: 将一个指针固定地与一个对象联系. 将常指针作为函数的形参, 目的是不允许在函数执行过程中改变指针变量的值.


void doSomething(Test * const p1){
    p1 -> setX(5);
    p1 -> printxy();
} 

指向常变量的指针

定义指向常变量的指针变量的一般形式为:


const 类名 *变量名 / 类型名 const *变量名;

只有常变量的指针能指向常变量:

在这里插入图片描述

指向常变量的指针变量可以指向未被声明为 const 的变量, 但不能通过此指针变量改变该变量的值.

在这里插入图片描述

重点:

如果一个变量已被声明为常变量 / 对象. 我们就只能用指向常变量的指针指向他, 而不能用非 const 型的变量 / 对象的指针去指向它.

指向对象的指针

定义指向对象的指针变量的一般形式为.


const 类名 *变量名 / 类名 const *变量名;

举个栗子:

在这里插入图片描述

如果一个对象已经被声明为常对象, 我们就只能用指向常对象的指针指向他. 而不能用指向非 const 型变量 / 对象的指针指向他.

指向常对象的指针变量可以指向未被声明为 const 的对象, 但不能通过此指针来改变该对象的值. 例如:

在这里插入图片描述

小结

指向常对象的指针最常用语函数的形参, 以保护形参指针所指向的对象在函数执行过程中不被修改.

当我们希望在调用函数时对象的值不被修改, 就应当把形参定义为指向常对象的指针变量. 同时用对象的地址作为实参 (对象可以是 const 或非 const 型).

在这里插入图片描述
在这里插入图片描述

对象的常引用

一个变量的应用就是变量的别名. 变量名和引用名都指向同一段没存单元.

函数的形参可以是对象的引用. 如果不希望在函数中修改实参的值, 可以将形参声明为常引用. 例如:


void fun(Time &t); 
void fun(const Time &);  // 常引用

我们应该尽量使用常引用作为函数参数, 原因有二:

  1. 既能保证数据安全, 使数据不能被随意修改
  2. 在调用函数时不必建立实参的copy, 可以提高程序运行效率

 总结

在这里插入图片描述

到此这篇关于C++ const 修饰符的文章就介绍到这了,更多相关C++ const 修饰符内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 详解C++ const修饰符

本文链接: https://www.lsjlt.com/news/125200.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解C++ const修饰符
    目录概述 常对象常对象成员常成员函数常数据成员数据成员访问限制常对象修改的限制 常指针指向常变量的指针指向对象的指针小结对象的常引用 总结概述 cons...
    99+
    2022-11-12
  • C++中const修饰符的详解及其作用介绍
    目录概述常对象常对象成员常成员函数常数据成员数据成员访问限制常对象修改的限制常指针指向常变量的指针指向对象的指针小结对象的常引用总结概述 const 是 constant 的缩写, ...
    99+
    2022-11-12
  • C++引用的使用与const修饰符
    目录1、引用2、函数引用传递3、引用与const4、const修饰符的优点1、引用 引用是给已经定义的变量一个别名,可以简单理解成同一个变量的昵称。既然是昵称或者是别名,显然它和原本...
    99+
    2022-11-12
  • C++中引用与const修饰符怎么用
    这篇文章主要介绍了C++中引用与const修饰符怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、引用引用是给已经定义的变量一个别名,可以简单理解成同一个变量的昵称。既...
    99+
    2023-06-25
  • C++之const限定符详解
    const限定符:把变量定义成一个常量 1.使用const对变量的类型加以限定,变量的值不能被改变 const int bufSize=512;//输入缓冲区大小 bufSize...
    99+
    2022-11-12
  • C++ const限定符以及顶层const和底层const的案例详解
    目录一、const限定符的作用二、const和引用三、const和指针四、顶层const和底层const1、顶层const2、底层const一、const限定符的作用   当我们在写...
    99+
    2022-11-12
  • Vue.js按键修饰符及v-model修饰符示例详解
    目录一、按键修饰符(1)回车键按键修饰符示例(2)自定义按键修饰符示例二、v-model修饰符(1).lazy(2).number (3).trim一、按键修饰符 v-on...
    99+
    2023-05-18
    Vue.js v-model修饰符 Vue.js按键修饰符 Vue.js修饰符
  • 详解Vue的sync修饰符
    目录1 、指令2 、修饰符3、 .sync 修饰符4 、总结1 、指令 指令即 Directive,从字面意思理解就是我告诉你要做什么,就是发送了一个指令,然后由接收指令的人去做就好...
    99+
    2022-11-12
  • Kotlin可见性修饰符详解
    目录一、 四种修饰符的说明二、在不同场景下各个修饰符声明的范围讲解2.1、在包(package)中声明,即顶层声明的情况2.1.1、测试同一个文件中声明不同的修饰符的范围2.1.2、...
    99+
    2022-11-12
  • Vue修饰符的使用详解
    目录事件修饰符的使用按键修饰符系统键修饰符鼠标按键修饰符表单修饰符总结事件修饰符的使用 <button @click.stop='func'>按钮</button&...
    99+
    2022-11-13
    Vue修饰符 Vue修饰符有哪些
  • Vue.sync修饰符与$emit(update:xxx)详解
    目录Vue .sync修饰符与$emit(update:xxx).sync修饰符的作用.sync修饰符之前的写法使用.sync修饰符的写法Vue .sync修饰符与$emit(upd...
    99+
    2022-11-16
    Vue sync修饰符 vue $emit vue .sync修饰符作用
  • C++中static修饰符的详解及其作用介绍
    目录概述静态数据成员引用静态数据成员用类名访问数据成员静态成员函数综合案例概述 static (静态) 修饰符是用来控制变量的存储方式和可见性的. 静态局部变量存储在静态区域: s...
    99+
    2022-11-12
  • C++继承类成员访问权限修饰符详解
    目录1. 前言2. 不同修饰下的类成员被访问权限3. 继承时的属性变化4. protected的作用总结1. 前言 C++提供了三个修饰符来限定类成员的被访问权限,分别是public...
    99+
    2022-11-12
  • C#修饰符有哪些
    这篇文章主要介绍“C#修饰符有哪些”,在日常操作中,相信很多人在C#修饰符有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#修饰符有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!本文向大家介绍C...
    99+
    2023-06-17
  • 详解Java中的访问修饰符
    详解Java中的访问修饰符?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、作用及种类UML类图建模语言或标准建模语言类的属性、操作中的可见性使用+、#、-分别...
    99+
    2023-06-15
  • C++中常用修饰符inline的详细介绍
    本篇内容介绍了“C++中常用修饰符inline的详细介绍”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在前面谈了const后,现在再来谈一下...
    99+
    2023-06-17
  • 详解C++中的const和constexpr
    目录一.const常量与#define比较二.const修饰1.修饰普通变量,必须初始化2.修饰类变量和成员变量3.修饰成员函数4.修饰指针5.修饰引用三.const转换四.顶层co...
    99+
    2022-11-12
  • C++和C中const的区别详解
    目录C中的constconst修饰局部变量const修饰全局变量const修饰的全局变量有外部链接属性const与指针C++中的constconst修饰普通全局变量const修饰普通...
    99+
    2022-11-12
  • C语言入门篇--四大常量(字面,const修饰,宏,枚举)及标识符
    目录1.字面常量2.const修饰的常变量3.#define定义的标识符常量3.1标识符3.2宏常量4.枚举常量1.字面常量 (1)字面意思是啥就是啥,看其表示就可以知道其值和类型。...
    99+
    2022-11-12
  • c语言和c++语言中const修饰的变量区别浅析
    目录c:修饰全局变量:修饰局部变量:c++:修饰全局变量:修饰局部变量:总结:在c语言中:在c++语言中:总结c: 修饰全局变量: 用const修饰的全局变量是没有办法直接修改的,间...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作