首页 > 编程语言 >C++ const的用法详解

C++ const的用法详解

时间:2024-08-22 19:05:08浏览次数:6  
标签:const 函数 int C++ 详解 修饰 变量 指针

前言
const在C/C++中是十分重要的,如果单纯理解为"常量"那么你的格局就小了,今天在这里给大家介绍一下const
在C++中具体详细的用法。
一 const的基本概念
const名叫常量限定符,用来限定特定变量,以通知编译器该变量是不可修改的。习惯性的使用
const,可以避免在函数中对某些不应修改的变量造成可能的改动。
二 const修饰基本数据类型
2.1 const 修饰一般常量及数组

点击查看代码
int const a=100;
const int a=100; //与上面等价
int const arr[3]={1,2,3};
const int arr[3]={1,2,3};//与上面等价
对于这些基本的数据类型,修饰符const可以用在类型说明符前,也可以用在类型说明符后,其结果是一样的。 2.2 const修饰指针(*) 主要有以下几种类型:
点击查看代码
char *p="hello"; //非const指针 非const数据
const char *p="hello"; //非const指针,const数据
char * const p="hello"; //const指针,非const数据
const char * const p="hello";//const指针, const数据
对于这些基本的数据类型,修饰符const可以用在类型说明符前,也可以用在类型说明符后,其结果是一样的。

2.2 const修饰指针(*)
主要有以下几种类型:

点击查看代码
char *p="hello"; //非const指针 非const数据
const char *p="hello"; //非const指针,const数据
char * const p="hello"; //const指针,非const数据
const char * const p="hello";//const指针, const数据

2.2.1 常量指针
const位于星号*左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量。
当为常量指针时,不可以通过修改所指向的变量的值,但是指针可以指向别的变量。

点击查看代码
int a=5;
const int *p=&a;
*p=20;// error 不可以通过修改所指向的变量的值
int b=20;
p=&b; //right 指针可以指向别的变量
2.2.3指针常量 const位于星号*的右侧,const就是修饰指针本身,即指针本身是常量 当为指针常量时,指针常量的值不可以修改,就是不能指向别的变量,但是可以通过指针修改它所指向的变量的值。
点击查看代码
int a=5;
int *const p=&a;
*p=20; //right 可以修改所指向变量的值
int b=10;
p=&b; //error 不可以指向别的变量
2.2.4 具体示例 代码如下
点击查看代码
#include<iostream>
using namespace std;
int main()
{
	int a = 10, b = 20;
	int* p1 = &a;//可以修改值 也可以修改方向
	*p1 = 100;
	p1 = &b;
	const int* p2 = &a;//指向
	cout << "p1=" << *p1 << endl;

	int const* p3 = &a;// const 在*前 可以修改指针指向方向
	p3 = &b;
	cout << "p3=" << *p3 << endl;
	
	int* const p4 = &a;// const 在*后 指向不可以改变,但指向的变量值可以改变
	*p4 = 100;
	cout << "*p4=" << *p4 << endl;
	//p4 = &b;// error

	system("pause");
}
3.1 const修饰函数参数 修饰函数形参:函数体内不能修改形参a的值 如果函数作为输入用,不论是什么数据类型,也不抡采用指针传递还是引用传递,都不能加const修饰, 否则参数会失去输出功能。 所以:const只能修饰输入作用的参数

3.1.1 如果参数为指针
如果输入参数为指针,加上const之后就会起保护指针意外修改的作用。
void StringCopy(char * strDest,const char * strSource);
在这个函数定义中,我们的参数strSource加上const修饰,就是为了防止strSource被修稿。
可以起到保护作用的原因是:
实参中,指针会指向一段内存地址,调用函数之后,函数会产生一个临时指针变量,这个变量的地址与实参的地址不一样,
但是这两个指针指向的内存是同一块。形参加上const修饰之后,保护了这一块内存地址不被修改,
如果刻意修改这一块内存,编译器会报错。
3.1.2如果参数为引用
如果输入参数为引用,加上const之后既起到了保护作用,也提高了程序效率。
void func(Y y);//这里的Y类型为用户定义的类型
void func(Y &y);//采用引用的方式
调用这个函数我们会产生一个临时对象,随后调用拷贝构造函数,当函数结束的时候,进行析构释放资源。
如果改成引用void func(A &a);只是相当于实参的一个别名,不会产生临时变量。
所以,如果是自定义类型,建议用引用作为函数形参。
3.2 const修饰函数返回值

修饰返回值,就是不能修改返回值
3.2.1 值传递
const int func();
对于函数来说,它的返回值为一个int类型的值,是一个临时的值没有必要用const修饰。
3.2.2 返回值为指针
如果返回值为指针,加上const修饰后,同样的内容是不可以修改的。
这个时候我们接收的变量也必须是const修饰:
const char*=func()
char * str=func();//error
const char * str=func(); //right

3.2.3 返回值为引用
如果返回值为引用,也可以提高效率。但是一般返回引用的地方并不是很多,一般会出现在类的赋值函数中。
而且,用const修饰返回值的引用类型的更少。一般来说不常用。
3.3 const修饰成员函数
const修饰的成员函数是为了保护成员变量,要求const函数不能修改成员变量,否则编译会报错。
函数体内不能修改成员变量的值,增加程序的健壮性或鲁棒性,只有成员函数才可以在后面加const,
普通函数后加const无意义。

点击查看代码
class MyClass{
public:
	void func(int x) const;

};

const函数的规则

  1. const对象只能访问const成员函数,非const的对象可以访问任何成员函数,包括const成员函数。
  2. 如果函数名、参数、返回值都相同的const成员函数和非const成员函数是可以构成重载,那么const对象调用const成员函数,非const对象默认调用非const的成员函数.
  3. const成员函数可以访问所有成员变量,但是只能访问const的成员函数。
  4. 非const成员函数,可以访问任何成员,包括const成员函数。
  5. const成员函数不能修改任何的成员变量,除非变量用mutable

四 类中定义变量(const的特殊用法)
在类中实现常量的定义大致有这么几种方式实现:使用枚举类型,使用const或static
4.1使用枚举类型

点击查看代码
class test
{
	enum{a=10,b=20};//枚举常量
	int array1[a];
	int array2[b];
};

4.2 使用const或static
C++11 仅不允许在类声明中初始化static非const类型的数据成员。

点击查看代码
#include<iostream>
using namespace std;
// using c++11 standard
class CTest11
{
public:
	static const int a = 3; // ok in C++11
	//static int b = 4;//Error
	static int b;
	const int c = 5; //ok in c++11
	int d = 6;
public:
	CTest11():c(0){}// ok in c++11

};
int main()
{
	CTest11 testobj;

	cout << testobj.a << testobj.c << testobj.d << endl;
	system("pause");
	return 0;
}

4.3 总结
在不同的标准下 是略微有所不同的

  1. 对于static const类型的成员变量不管是旧的C++标准还是C++11都是支持在定义时初始化的。
  2. 对于const 非staic类型的成员变量C++03和C++11的标准都是不支持在定义时初始化的。
  3. 对于const非static类型的成员变量C++03要求必须在构造函数的初始化列表中来初始化,而C++的标准支持这种写法,同时允许在定义时进行初始化操作。
  4. 对于非static 非const成员变量,C++03标准不允许在成员变量定义时初始化,但是C++11标准
    允许在类的定义时对这些非静态变量进行初始化。

五 使用const的好处

  1. 可以定义const常量
    这样可以避免由于无意间修改数据而导致的编程错误,提供了一个保护作用。

  2. 便于进行类型检查
    const常量有数据类型,而宏常量没有数据类型,编译器可以对前者进行类型安全检查,而对后者只进行字符替换,
    没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。

  3. 为函数重载提供了一个参数
    const修饰的函数可以看做是对同名函数的重载

  4. 可以节省空间,避免不必要的内存分配
    编译器通常不为普通const常量分配存储空间,而是将他们保存在符号表中,这使得它成为一个编译期的常量,
    没有了存储与读内存的操作,是的它的效率也很高。

标签:const,函数,int,C++,详解,修饰,变量,指针
From: https://www.cnblogs.com/SunshineWeather/p/18374533

相关文章

  • [小白入门]一文掌握C/C++中数组和循环结合(堵车问题、红绿灯问题)
    1.堵车问题假如现在给定从出发地到目的地的道路条数和每条路上的车辆情况为:第一条路第二条路第三条路第四条路第五条路第六条路90705278108120且车辆数大于50为轻度拥堵;大于70为中度拥堵;大于90为重度拥堵。那么如何存储这些数据?---很显然要用数......
  • C++常用容器
    目录一、引言二、顺序容器概览  1.vector——动态数组  2.deque——双端队列  3.list——双向链表三、关联容器探秘  1.set——集合  2.map——映射四、总结        在探讨C++容器的丰富世界时,我们将深入分析几种核心容器,并探讨它......
  • 南京理工大学C++程序设计基础期末考试上机测试题组3答案详细解析
    角谷步数(100分)任意的正整数,比如5,我们从它开始,如下规则计算:如果是偶数,则除以2,如果是奇数,则乘以3再加1。如此循环,最终必会得到“1”!比如5的处理过程是:5168421一个正整数经过多少步才能变成1,称为角谷步数。对于5而言,步数也是5;对于1,步数为0。输入一个整数n(1<n<300)......
  • C++小程序:1.0 混合运算小程序(原创)
    自编小程序,还有一些困惑,不太稳定,欢迎私信或评论,提供建议、bug和不足之处。代码:#include<bits/stdc++.h>#include<windows.h>#include<ctime>usingnamespacestd;voidclean();stringnandu();voidxunhuan();voidshuju();longlonga,b,c,cishu,xuanze,cf_a,cf_......
  • Visual C++ 下载安装教程(微软常用运行库合集|dll报错必装)
    前言MicrosoftVisualC++Redistributable(简称MSVC,VB/VC,系统运行库)是Windows操作系统应用程序的基础类型库组件。此版VisualC++运行库组件合集(微软常用运行库合集)由国内封装爱好者@Dreamcast打包而成,整合VisualC++组件安装包运行库所有版本,提供图形安装界面,可自选更新VC++版......
  • Cookie,Session Filter,Listener详解
    HTTP请求的无状态性HTTP的无状态性是其一个重要的特征,指的是HTTP协议本身并不保留客户端与服务器交互的历史信息,换而言之,即每次的HTTP请求都是独立的,服务器在处理每一个请求时都不会记住前一个请求的状态无状态的含义独立性:每次的HTTP请求都是独立的,不依赖于之前的请......
  • [C++]括号使用小技巧
    1.前言  对于一般的赋值语法,例如inta=0;  但你知道吗?使用括号可以同时写很多类型,编译器一般默认括号内最后一个类型为赋值类型,例如//编译器会选择最后一位进行赋值inta=(100,200,300,0);  此时,a的值就是0。2.改变函数返回值  有如下三个函数,返回值类型分别......
  • uniapp [全端兼容] - 最新详细实现拍摄视频录像并可播放预览视频,调起本机摄像头开启录
    前言网上的教程乱七八糟BUG太多,本文提供优质示例代码。在uni-app全平台兼容(H5网页网站、支付宝/微信小程序、安卓App、苹果App、nvue)项目开发中,详解完成“uniApp拍摄录制视频并预览播放”,调起本机系统摄像头打开视频录制,用户点击按钮开始拍摄视频最终完成摄影,然后保......
  • C++ SPFA算法解析
    前言将了解C++求最短路中SPFA的算法SPFASPFA的一些说明SPFA:适用于权值有负值,且没有负圈的图的单源最短路径,论文中的复杂度O(kE),k为每个节点进入Queue的次数,且k一般<=2,但此处的复杂度证明是有问题的,其实SPFA的最坏情况应该是O(VE).!引例:输入格式给出一个有向图,请输出从......
  • 电化学一氧化碳传感器:工作原理与应用详解
    电化学一氧化碳传感器是一种用于检测空气中一氧化碳(CO)浓度的设备,它基于电化学原理运作。这类传感器的核心组成部分包括电极、电解质和透气膜,它们共同构成一个微型的电化学电池。电化学一氧化碳传感器的特点包括:快速响应:传感器能够迅速地对气体浓度变化做出反应。高灵敏度:......