const的常见用法

原博文:http://blog.csdn.net/bizhu12/article/details/6672723

const用法主要是防止定义的对象再次被修改,定义对象变量时要初始化变量

下面介绍几种常见的用法:

1.用于定义常量变量,这样这个变量在后面就不可以再被修改

const int Val=10;

//Val=20;//错误,不可被修改

2.保护传参时参数不被修改,如果使用引用传递参数或按地址传递参数给一个函数,在这个函数里这个参数的值若被修改,则函数外部传进来的变量的值也发生改变,若想保护传进来的变量不被修改,可以使用const保护

#include "stdafx.h"
#include <iostream>
using namespace std;
void fun1(const int &val)
{
	//val=10;//出错
}
void fun2(int &val)
{
	val=10;//没有出错
}
void main()
{
	int a=2, b=2;
	fun1(a);//因为出错,这个函数结束之后a的值还是2
	fun2(b);//传引用,b的值改变为10
	cout<<"a = "<<a<<" b = "<<b<<endl;
	system("pause");
}
如果只想把值传给函数,而且这个值不能被修改,则可以使用const保护变量。有人说为什么不选择按值传递,按值传递还需要把这个值复制一遍,而引用不需要,使用引用是为了提高效率//如选择按值传递的话,没必要加const

3.节约内存空间

#define PI 3.14 //使用#define宏

const double Pi=3.14 //使用const,这个时候PI并没有放入内存中


double a=Pi;//这时候才为Pi分配内存,不过后面再有这样的定义不会再分配内存

double b=PI;//编译时分配内存

double c=Pi;//不会再分配内存

double d=PI;//编译时再分配内存

const定义的变量,系统只为它分配一次内存,而使用#define定义的常量宏,能分配好多次,这样const就很节约空间

4.类中使用const修饰函数防止修改非static类成员变量

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

class Num
{
public:
	void fun() const
	{
		//a=0;//出错,不可修改非static的值
		b=10;
	}
	void show()
	{
		cout<<a<<"   "<<b<<endl;
	}
private:
	int a;
	static int b;
};
int Num::b=0;
int main()
{
	Num num;
	num.fun();
	num.show();
	system("pause");
	return 0;
}
5.修饰指针

const int *A; 或int const *A;//const修饰指向的对象,A可变,A指向的对象不可变

int *const A;//const修饰指针A,A不可变,A指向的对象可变

const int *const A;//指针A和A指向的对象都不可变。

#include "stdafx.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	int i=1,j=100;//在栈中申请两个内存地址i,j;
	const int *A;//const修饰指向的对象,A可变,A指向的对象不可变
	A=&i;
	cout<<"A的内存为:"<<A<<" A内存中存的值为:"<<*A<<endl;
	A=&j;
	cout<<"改变内存块"<<endl;
	cout<<"A的内存为:"<<A<<" A内存中存的值为:"<<*A<<endl;
	//*A=10;//错误,A指向的对象不可变,只能通过改变内存块来改变内存值
	//cout<<"改变指针指向的值"<<endl;
	//cout<<"A的内存为:"<<A<<" A内存中存的值为:"<<*A<<endl;
	int const *B;//同A
	B=&i;
	cout<<"B的内存为:"<<B<<" B内存中存的值为:"<<*B<<endl;
	B=&j;
	cout<<"改变内存块"<<endl;
	cout<<"B的内存为:"<<B<<" B内存中存的值为:"<<*B<<endl;
	//*B=10;//同A
	/*cout<<"B的内存为:"<<B<<" B内存中存的值为:"<<*B<<endl;*/
	int * const C= &i; //C必须设定初始值,C不可变,C指向的值可变
	cout<<"C的内存为:"<<C<<" C内存中存的值为:"<<*C<<endl;
	//C=&j;//错误,C内存块不能变,
	*C=10;//内存块不能改变,但内存块指向的值可以改变
	cout<<"改变指针指向的值"<<endl;
	cout<<"C的内存为:"<<C<<" C内存中存的值为:"<<*C<<endl;
	const int *const D=&i;
	//*D=10;//错误,同A
	//D=&j;//错误,同C
	cout<<"D的内存为:"<<D<<" D内存中存的值为:"<<*D<<endl;
	system("pause");
	return 0;
}
6.修饰函数返回值,防止返回值被改变

const int fun();

接收返回值的变量也必须加const

const int a=fun();//接收变量也要是const的,int a=fun()是错误的。

7.修饰类的成员变量

使用const 修饰的变量必须初始化,在类中又不能再定义时初始化。

如:

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

class Num
{
public:
	Num():c(50)
	{}
	void fun()
	{
		a=0;
		//c=100;//出错,const声明的c不能改变
		//b=10;//静态变量为不可修改值
	}
	void show()
	{
		cout<<a<<"   "<<b<<" "<<c<<endl;
	}
private:
	int a;
	const static int b=5;
	const int c;
};
//int b=5;
//int Num::b=5;
int main()
{
	Num num;
	num.fun();
	num.show();
	system("pause");
	return 0;
}
静态变量的初始化不加const得在类外进行初始化,加const可以在类中声明时初始化,也可以在类外进行初始化。const int Num::b=5;
8.const定义的对象变量只能作用于这个程序该C/C++文件,不能被该程序其他C/C++文件调用

如file1.cpp中,const int Val;

如file2.cpp中,extern int Val;//错误,无法调用

要想const定义的对象变量能被其他文件调用,定义时必须要使用extern修饰为

extern const int Val;

非const 变量默认为extern,要是const能被其他文件访问,必须显示指定为extern。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的公寓报修管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本公寓报修管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此公寓报修管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。公寓报修管理系统有管理员,住户,维修人员。管理员可以管理住户信息和维修人员信息,可以审核维修人员的请假信息,住户可以申请维修,可以对维修结果评价,维修人员负责住户提交的维修信息,也可以请假。公寓报修管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:公寓报修管理系统;Spring Boot框架;MySQL;自动化;VUE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值