Cpp中的常类型

0.常类型、const与符号常量

  • 常类型
    用类型修饰符const说明的类型,特点是被说明的值或对象是不能被更新的。因此,定义或说明常类型时必须进行初始化
  • 符号常量
    用常量相关的标识符来替代常量出现在程序中,属于常量的一种。
  • 类型说明符const
    将一个变量变为符号常量

综上,常类型是带类型修饰符const的类型,其将变量变为符号常量。
常量就是在程序中不被改变的量。常量不变,所以之后不能被更新;常量的值存在而在程序运行中不能被更新,所以它在定义或说明时必须被初始化

1.不同类型常量的定义与助记

1.1定义汇总
类型定义格式例子
一般常量<类型说明符> const 或
const <类型说明符>
int const x = 5
const int x = 5
对象常量<类名> const <对象名>(<初值>)
const <类名> <对象名>(<初值>)
A const a1(3,4)
const A a2(3,4)
常指针
地址值是常量
<类型> *const <指针名> = <初值>char *const p1=s1
常指针
指向的值是常量
const <类型> *<指针名> = <初值>const *p2 =s2
常引用const <类型> &<引用名> = <初值>const int v = b
1.2 const位置与不可更新量
  • 一般常量
    指的是简单类型的常量,const 放在类型说明符(int、double等)前后都可以。
    以整形x为例,从标识符看起:1中可以理解为先把变量x化为常量,再规定常量类型;2中可以理解为把整型变量x化为常量。
/*
<类型说明符> const 或
const <类型说明符>
*/
int const x = 5;//1
const int x = 5;//2
  • 对象常量
    类的对象为常量,它的数据成员不可更新。
    const放在对象名前是合理的,该对象就近为常量。
    const放在类前同样合理,定义了该类的对象后,再将变量变化为常量。
/*
<类名> const <对象名>(<初值>)
const <类名> <对象名>(<初值>)
*/
class A
{
	public:
		A(int i,int j)
		{x=i;y=j;}
	private:
		int x,y;
};
	const A a1(3,4);
	A const a2(3,4);
  • 常指针
    回顾,指针是用来存放某个变量地址值的一种变量。定义指针时要指出该指针的类型,即在指针名前冠以*,表明*后面的变量是指针。
    const加在指针名前表示指针(地址)不可变,只能更改这一存储单元的内容。const加在类型说明前表示指向的内容不能变,指针可以指向不同的存储单元。
//定义格式:<类型>*<指针名>
char s[] = "HI";
char s1[] = "good morning";
char s2[] = "good afternoon";

char *p = s; //此处是一个普普通通的指针
p = s1;//想改地址就改地址(Cpp规定数组名是指向数组首元素的常量指针)
*p = "BYE";//想改指向的内容就改指向的内容

char *const p1 = s1;//指针(地址)是常量
p1 = s2;//非法,地址不可变
*p1 = "BYE";//合法

const char *p2 = s2;指针指向内容是常量
p2 = s1;//合法
*p2 = "BYE";//非法
  • 常引用
    引用是某个已知变量或对象的别名,不占内存。当我们说某个量的引用是常量时,也就是说这个量不能被更新。
/* const <类型说明符> & <引用名> = <初值>
等价于
const <类型说明符> <变量名> = <初值>
*/

int b = 1;
const int &v =b;//b=1不能被更新
//等价于
const int b =1;//b=1不能被更新
1.3 常指针与常引用的用途

常指针与常引用常常被用来作为函数的参数,这样的参数成为常参数。使用常参数表明该函数不会更新某个参数所指向或所引用的对象,这样在参数传递过程中就不需要执行复制构造函数,可以改善效率。
复制构造函数是用已知对象来创建一个新对象。

2.常类型在类中的应用

2.1 常数据成员

const修饰的数据成员,它必须被初始化

class A
{
public: 
	A(int i);//构造函数
	const int & r;//常引用作为数据成员
private:
	const int a;
	static const int b;
};

const int A::b = 10;
//b静态常变量初始化,静态数据成员static只存储在一处,供所有成员使用
//是类的数据而非函数的数据

A::A(int i): a(i),r(a)
{
}
//构造函数格式变化
//冒号后进行常数据成员的初始化
//在构造函数中初始化代表是对象的数据
2.2 常成员函数

const说明的成员函数,有资格操作常量或常对象。实现部分也要带const。
this是系统自动提供的,是一个指向正在操作某个成员函数的对象的指针。常成员函数的this指针所指向的内容(对象)不可变,所以这个对象必须是常对象。

//<类型说明符> <函数名> (<参数表>) const;
class B
{
public: 
	B(int b1, int b2)
	{B1=b1, B2=b2;}
	void print() const;//常成员函数说明
private:
	int B1, B2;
};
void B::print() const//B的成员函数说明
{
cout<<B1<<","<<B2<<endl;
}

int main()
{
const B b(1,2);//对象常量
b.print;
}
	
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zeror_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值