C++之const

server/2024/11/15 0:42:01/

        const是C++中的关键字,又叫常量限定符,作用是告知编译器const修饰的变量是不可修改的。

1、const修饰常量

1.1、修饰常量

#include <iostream>
using namespace std;int main(int argc, char argv[])
{// 在修饰常量时,int const和const int是等价的。int const a = 10;const int b = 20;cout << "a: " << a << "; b: " << b << endl;//a = 30;  // 不允许修改,执行错误//b = 40;  //不允许修改,执行错误return 0;
}

结果:

a: 10; b: 20

1.2、修饰数组

#include <iostream>
using namespace std;int main(int argc, char argv[])
{// 在修饰数组时,int const和const int是等价的。int const a[5] = {10, 20, 30, 40, 50};const int b[5] = {60, 70, 80, 90, 100};cout << "a: " << a[2] << "; b: " << b[3] << endl;//a[3] = 30;  // 不允许修改,执行错误//b[4] = 40;  //不允许修改,执行错误return 0;
}

结果:

a: 30; b: 90

1.3、修饰指针

#include <iostream>
#include <string>
using namespace std;int main(int argc, char argv[])
{// 变量num的值可以任意修改int num = 1876;// ptr_1将一直也只能指向变量num,不能指向别的int型变量int* const ptr_1 = &num;// 不能通过ptr_2修改num的值,ptr_2可以指向别的int型变量const int* ptr_2 = &num;// ptr_3将一直也只能指向变量num,不能通过ptr_3修改num的值const int* const ptr_3 = &num;return 0;
}

总结:

        若const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量。

        若const位于*的右侧,则const就是修饰指针本身,即指针本身是常量。

2、const修饰函数

        const在函数中根据修饰的位置分为三种:函数参数、函数返回值、成员函数。

2.1、const修饰函数参数

        参数可以是变量、指针、引用等。

#include <iostream>
#include <string>
using namespace std;int sum(const int a, const int b)
{// a = 100;    // 执行错误,const修饰不能修改return a + b;
}int main(int argc, char argv[])
{int a = 10;int b = 20;cout << "sum: " << sum(a, b) << endl;return 0;
}

结果:

sum: 30

2.2、const修饰函数返回值

        返回值可以是指针、引用、或者值传递(值传递没有必要用const修饰)等。

#include <iostream>
#include <string>
using namespace std;class student
{
public:private:int age = 10;
};student std_1;// 值传递,没有必要用const修饰
const int sum(int a, int b)
{return a + b;
}// 返回值为指针
const student* get()
{return &std_1;
}int main(int argc, char argv[])
{int a = 10;int b = 20;cout << "sum: " << sum(a, b) << endl;const student* std_2 = get();student std_3;//std_2 = std_3;  // std_2是一个常量不能改变return 0;
}

结果:

sum: 30

2.3、const修饰类的成员函数

        const修饰的成员函数为了保护成员变量,要求const函数不能修改成员变量,否则编译会报错。

        函数体内不能修改成员变量的值,增加程序的健壮性或鲁棒性。只有成员函数才可以在后面加const,普通函数后加const无意义。

#include <iostream>
#include <string>
using namespace std;class student
{
public:void set(int age_t) const;
private:int age = 10;
};void student::set(int age_t) const
{// 因为age是成员变量,set函数不能修改成员变量的值,所以此处执行失败//age = age_t;cout << "aa bb cc dd ee ff." << endl;
}int main(int argc, char argv[])
{student std_1;std_1.set(100);return 0;
}

结果:

aa bb cc dd ee ff.

const函数的规则:

        [1]、const对象只能访问const成员函数,非const的对象可以访问任何成员函数,包括const 成员函数。

        [2]、如果函数名、参数、返回值都相同的const成员函数和非const成员函数是可以构成重载,那么const对象调用const成员函数,非const对象默认调用非const的成员函数。

        [3]、const成员函数可以访问所有成员变量,但是只能访问const的成员函数。

        [4]、非const成员函数,可以访问任何成员变量,也可以访问任何成员函数。

        [5]、const成员函数不能修改任何的成员变量,除非变量用mutable修饰。


http://www.ppmy.cn/server/23555.html

相关文章

怎么给字符串字段加索引?

怎么给字符串字段加索引&#xff1f; 现在&#xff0c;几乎所有的系统都支持邮箱登录&#xff0c;如何在邮箱这样的字段上建立合理的索引&#xff0c;是我们今天要讨论的问题。 假设&#xff0c;你现在维护一个支持邮箱登录的系统&#xff0c;用户表是这么定义的&#xff1a; …

2024-4-29

今日流水账&#xff1a; 上午&#xff1a; 还是在看相关源码&#xff0c;搞懂了 unix socket 和 inet soeket 的区别&#xff0c;并且终于搞懂了 SCM_RIGHTS 一些源码的细节&#xff0c;太不容易了~~~&#xff0c;但还是感觉效率不高&#xff0c;下午的把效率提起来了 下午&am…

Agent AI智能体的未来

Agent AI智能体的未来 随着Agent AI智能体的智能化水平不断提高&#xff0c;它们在未来社会中的角色、发展路径以及可能带来的挑战也引起了广泛关注。快来分享一下你的看法吧~ 提醒&#xff1a;在发布作品前&#xff0c;请把不需要的内容删掉。 方向一&#xff1a;技术进步与…

mpv编译播放器无视频输出

编译了几天终于编译好了&#xff0c;但发现没有视频输出&#xff0c;只有声音 百度后发现 mpv -vohelp命令查询当前识别驱动 Available video outputs: gpu Shader-based GPU Renderer gpu-next Video output based on libplacebo libmpv …

Windows Server Backup设置定时备份保留N天

Windows Server - 运维篇 第四章 Windows Server Backup设置定时备份保留N天 Windows Server - 运维篇系列文章回顾Windows Server Backup设置定时备份保留N天使用VSS卷影复制服务工具删除指定天数的VSS备份文件CMD&#xff1a;wbadmin.exeCMD&#xff1a;wbadmin.mscPowerShel…

MySQL并行复制

在MySQL中&#xff0c;为了提高从服务器的复制效率和性能&#xff0c;可以使用并行复制&#xff08;Parallel Replication&#xff09;。replica_parallel_workers 和 replica_parallel_type 是与并行复制配置相关的两个系统变量。 replica_parallel_workers 定义&#xff1a…

IPFoxy静态原生住宅IP代理有哪些应用?

当前越来越多的商家开始将目光投向海外市场&#xff0c;希望能够拓展业务&#xff0c;触及更广阔的消费群体。在这个过程中&#xff0c;IPFoxy静态原生住宅IP代理技术发挥着重要的作用&#xff0c;为跨境电商提供了全方位的解决方案。本文将深入探讨IPFoxy静态原生住宅IP代理在…

使用python写一个识别人脸

人脸识别的原理涉及多个领域&#xff0c;包括图像处理、特征提取和机器学习等。以下是一个简化的概述&#xff0c;并展示了如何使用Python和OpenCV库来实现基本的人脸识别。 人脸识别原理概述 图像预处理&#xff1a;首先&#xff0c;我们需要对输入的图像进行预处理&#xf…