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;
}