C++const修饰变量,函数,类

2023-11-07

const修饰变量

const的作用是:在编写程序过程中,因为我们会调用各种函数,假如我们并不想让某个已经赋了初值的变量在程序运行过程中受到改变,因此我们用const来作为关键字来修饰。

定义格式:const+typename+变量名:const int a;或者是typename+const+变量名:int const a

如果我们尝试想要改变const定义的变量值的话,会出现

另外const作用于变量最常用的是引用的方法:

#include<iostream>
int main()
{
	int a = 4;
	const int &b = a;
	int& c = a;
	b = 5;//编译器报错,表达式必须是可修改的左值
	c = 5;//正确;


}

 在上述代码中,b是a的一个引用,可是我们并无法通过b来改变a的值(因为被定义成了const),而c则可以,我们可以通过改变c的值来改变a和b。在引用过程中const引用的对象b的值会随着引用的对象自身a或者是其他非const引用的对象c的改变而改变。

const用于指针注意事项:

const int*p意思为*p是不可改变的,p=&a是对的,但是*p=a报错;

int* const p意思是p是不可变的,*p=a是对的,但是p=&a报错;

const int*const p意思是无论*p或者是p都是不可变,上述俩全是错的。


const修饰函数

修饰函数参数:typename+函数名(const typename+参数名,const typename+参数名...)

这种方法多用于指针和引用的情况,防止指针或者是对象副本在函数里面被改变(如果是const int/char/double(内置) +参数名这种的话,用const意义不大,因为函数调用时是将实参复制成形参,对形参的操作影响不到实参(直接在函数内定义一个const int a=**更简单),所以没必要对这种类型的使用const

在使用const作为参数时要注意传递的参数类型和const定义的参数是否类型相同:

注意:const类型定义的指针类型的参数传参时可以是非const或者是const;

           非const类型定义的指针类型的参数传参时必须是非const。

#include<iostream>
int add(const int* a, const int* b)
{
	return *a + *b;
}
int reduce(int* a, int* b)
{
	return *a + *b;
}
int main()
{
	const int x = 3;
	int y = 5;
	std::cout << add(&x, &y);
	std::cout << reduce(&x, &y);//第一个参数&x报错
}

修饰函数返回值:

const作用于函数最前面,表示返回值不可以被更改,下例中c的地址是返回值,不可以被更改,但是让const int*p=c的地址,这同时让*p的值不可以被更改,之所以这样做是因为让返回值类型对照上。

多用于指针和引用方面,同时也需要注意返回值类型只能赋给带有const的同类型

#include<iostream>
	const int* add(const int* a, const int* b)
	{
		static int c = *a + *b;
		return &c;
	}

	int main()
	{
		const int x = 3;
		const int y = 5;
		//int* p = add(&x, &y);错误(活动)	E0144	"const int *" 类型的值不能用于初始化 "int *" 类型的实体
		const int* p = add(&x, &y);//true,这个const修饰的是*p
		std::cout << *p;//8
	}

当采用值传递的方法,函数会在返回之前将结果复制并放在一个临时的储存单元中,加不加const无意义。

#include<iostream>
const int add(const int* a, const int* b)
	{
		static int c = *a + *b;
		return c;
	}

	int main()
	{
		const int x = 3;
		const int y = 5;
		const int q = add(&x, &y);//true
		int p = add(&x, &y);//true
		std::cout << q << " " << p;
	}

const用于类

1.用于类的成员变量,成员变量值无法被修改,构造函数里面也不可出现const所定义的变量,可以在定义时候给出值。

#include<iostream>
int main()
{
	class time
	{
	public:
		time(int x=2,int y=4)
		{
			a = x;
			b = y;//error 表达式必须是可被修改的左值
		}
	private:
		int a;
		const int b=2;
	};
}

2.用于类的成员函数,注意这个成员函数只可以读,不可以写入,是在参数()后给出的const

#include<iostream>
class time1//time也可以是函数库里面的一个函数,在定义时time无法用作全局,会被识别成函数
{
public:
	time1(int x = 2, int y = 4)
	{
		a = x;
		b = y;//error 表达式必须是可被修改的左值
	}
	void print()const
	{
		std::cout << a << "::" << b<<std::endl;
		//a++;//error 表达式必须是可被修改的左值
	}
	void print1()
	{
		std::cout << a << "and" << b;
	}
private:
	int a;
	int b;
};
int main()
{

	time1 q;
	q.print();
	q.print1();//普通对象可以调用const成员函数和普通函数;
}

3.常对象和mutable

常对象是指定义对象之后,其所以数据成员无法被修改(mutable定义的除外)。和const定义的普通变量一样,常对象在定义的同时必须初始化,注意:常对象只可以调用const的成员函数,不可以用普通成员函数;而普通对象可以调用const或者是普通的成员函数。

#include<iostream>
class time1//time也可以是函数库里面的一个函数,在定义时time无法用作全局,会被识别成函数
{
public:
	time1(int x = 2, int y = 4)
	{
		a = x;
		b = y;//error 表达式必须是可被修改的左值
	}
	void print()const
	{
		std::cout << a << "::" << b<<std::endl;
		//a++;//error 表达式必须是可被修改的左值
	}
	void print1()
	{
		std::cout << a << "and" << b;
	}
private:
	int a;
	int b;
};
int main()
{
	const time1 p;
	time1 q;
	q.print();//true
	q.print1();//普通对象可以调用const成员函数和普通函数;
	p.print();//true
	p.print1();// 错误(活动)	E1086	对象含有与成员 函数 "time1::print1" 不兼容的类型限定符
}

如果真的想要修改常对象里面的数据成员,可以将其声明成mutable,这样就可以修改。mutable一般用于常对象,普通对象如果想要修改数据成员在不用mutable,在非常函数里面进行修改即可。

#include<iostream>
class time1//time也可以是函数库里面的一个函数,在定义时time无法用作全局,会被识别成函数
{
public:
	time1(int x = 2, int y = 4)
	{
		a = x;
		b = y;//error 表达式必须是可被修改的左值
	}
	void print()const
	{
		b++;//mutable声明的可以修改
		std::cout << a << "::" << b<<std::endl;
		//a++;//error 表达式必须是可被修改的左值
	}
	void print1()
	{
		std::cout << a << "and" << b;
	}
private:
	int a;
	mutable int b;
};
int main()
{
	const time1 p;
	p.print();

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++const修饰变量,函数,类 的相关文章

随机推荐

  • C++入门——引用(重点!!!)

    文章目录 引用概念 引用特性 常引用 const 使用场景 1 做参数 输出型参数 2 做返回值 引用返回 引用和指针的区别 引用概念 引用不是新定义一个变量 而是给已存在的变量取了一个别名 编译器不会为引用变量开辟内存空间 它和它的引用变
  • springboot+MD5实现注册登录的密码的加密解密

    写在前面 你们好 我是小庄 很高兴能和你们一起学习mybatis 如果您对Java感兴趣的话可关注我的动态 写博文是一种习惯 在这过程中能够梳理知识和巩固知识点 需求 登录和注册的密码涉及到网络安全 对密码的加密能够在一定程度上增加安全性
  • linux shell字符串截取

    linux字符串截取很有用 有八种方法 有变量url https www test com 123 html 号截取 删除左边字符 保留右边字符 echo url 输出 www test com 123 html 其中url是变量名 是运算
  • 【极简代码】Unity控制3D物体的自由旋转 缩放和移动

    Unity中以最少代码 控制3D物体的自由旋转 缩放和移动 using UnityEngine public class TestMatrix MonoBehaviour float scaleparam 0f Vector3 oldSca
  • (2)一文懂“AI推理芯片” 测试方法与测试指标

    1 前言 Inference是用于测试系统使用训练有素的模型处理输入和产生结果的速度 1 1 缘起 随着人工智能应用的崛起 其在不同的硬件芯片平台上的性能也逐渐变成了比较不同硬件和芯片的重要参考 然而 最初由各个芯片厂商自行公布的跑分结果往
  • ros::spin()和ros::spinOnce()介绍讲解及区别

    首先要理解的一点是 任何一个发布和订阅 都会有其对应的发布缓存区和订阅缓存区 正如advertise和subscribe函数中都有缓存数量的参数 当有发布者发布消息后 会存放在发布缓存区 如果该topic有订阅者 则从发布缓存区读取到订阅缓
  • Redis数据类型

    业务数据的特殊性 数据类型既然是用来描述数据的存储格式的 如果你不知道哪些数据未来会进入到我们来的redis中 那么对应的数据类型的选择就会出现问题 原始业务功能设计 秒杀 他这个里边数据变化速度特别的快 访问量也特别的高 用户大量涌入以后
  • kali root默认密码_Kali Linux root 默认密码是:toor

    如果你听到一个 13 岁的黑客吹嘘他是多么的牛逼 是有可能的 因为有 Kali Linux 的存在 尽管有可能会被称为 脚本小子 但是事实上 Kali 仍旧是安全专家手头的重要工具 或工具集 Kali 是一个基于 Debian 的 Linu
  • java实现读取服务器日志文件,Java实时读取日志文件

    编码实现 写日志文件 每秒写200条记录 并且记录写的时间 import java io File import java io IOException import java io RandomAccessFile import java
  • vue配置开发环境和生产环境调用不同的域名以及跨域问题

    注意 这里vue项目与后端是前后端完全分离的 所有请求后端的地址是不一样的 安装axios npm install axios 然后 npm install save axios vue axios 用到post请求时 需要安装qs imp
  • Apache RocketMQ 5.0 消息进阶:如何支撑复杂的业务消息场景?

    一致性 首先来看 RocketMQ 的第一个特性 事务消息 事务消息是 RocketMQ 与一致性相关的特性 也是 RocketMQ 有别于其他消息队列的最具区分度的特性 以大规模电商系统为例 付款成功后会在交易系统中订单数据库将订单状态更
  • #101. 级数求和(3月31日)

    一 这题很简单我们只要注意高精度就行了 我一开始就是使用int型 傻傻算半天 int型 1 任何数 都只得整数 所以我们要用double来计算 只要从1开始一直网上循环摘要当我们的sn大于p时我们就停止循环 这题就是这样只要注意高精度就行了
  • linux链接jsoncpp库时,报一堆标准库错误的解决方法

    最近在一个工程中链接jsoncpp库 Makefile文件中添加包含路径代码 I usr local include json 编译时报错 usr include stdio h 821 错误 FILE 在此作用域中尚未声明 usr inc
  • 隐患重重遭诟病 细数固态硬盘“七宗罪”

    此内容转自网络 本人认为文章内容优秀 只作收藏 作为自己的知识库 并不用他用 原文链接地址为 http ssd zol com cn 471 4715723 all html 隐患重重遭诟病 细数固态硬盘 七宗罪 2015 02 28 19
  • vue.js -- slot插槽

    slot插槽 子组件提供给父组件使用的占位符 表示父组件可以占位符中填充内容 填充的内容会替换子组件的标签 插槽显不显示 怎样显示是由父组件来控制的 而插槽在哪里显示就由子组件来进行控制 slot作用域 slot在哪里调用 就使用哪里的数据
  • 数据管道(data pipeline)与ETL管道(ETL pipeline)的区别

    数据管道与ETL管道 这两个词的意义是相近的 差别比较微小 有时候很多人会混用 ETL管道 描述的是一组进程 实现将数据从一个系统抽取出来 经过转换 最终再加载到其他数据库或数据仓库中 数据管道 是一个比ETL管道更加通用的术语 只要是实现
  • 生成式AI:为开发者设计的革命性工具

    随着人工智能技术的飞速发展 生成式AI已成为许多领域的关键技术 生成式AI是指一类人工智能技术 能够通过学习数据集的内在规律和相关性 生成全新的 真实的 有用的数据 这种技术已经被广泛应用于图像 语音 自然语言处理等领域 成为人工智能领域的
  • 以太坊虚拟机EVM的工作原理是怎样的

    以太坊虚拟机EVM的工作原理是怎样的 如果你打算尝试在以太坊区块链上开发智能合约 或者已经在该领域工作了一段时间 可能会遇到EVM一词 EMV是太坊虚拟机的缩写 虚拟机本质上是在执行代码和执行的机器之间创建一个抽象级别 需要这一层抽象来提高
  • android系统 分辨率对应资源文件

    分辨率对比 ldpi 240x320 mdpi 320x480 hdpi 480x800 480x854 xhdpi 至少960 720 xxhdpi 1280 720 或 ldpi QVGA 240 320 mdpi HVGA 320 4
  • C++const修饰变量,函数,类

    const修饰变量 const的作用是 在编写程序过程中 因为我们会调用各种函数 假如我们并不想让某个已经赋了初值的变量在程序运行过程中受到改变 因此我们用const来作为关键字来修饰 定义格式 const typename 变量名 con