C++中的常量

1. 字面量

int Num = 0;
cout<<"ERROR"<<endl;

定义的变量Num,初始化赋值位0。这个0是代码的一部分,在编译过程中,只要后面的代码不对其进行修改,则其值是不会进行改变的,就相当于一个不变量。也就是字面量,下面的“ERROR”字符串也是字面量

2. const修饰

const double Pi = 22.0/7;
double Area = 2 * Pi * 2;
//Pi = 3.14 ERROR

const int* IntPtr = NULL;
int* const DoublePtr = NULL;
const int* const ThirdPtr = NULL; 

使用cosnt时,只能在声明时初始化。但是一经定义就不允许修改,这就是const修饰的常量。
要养成使用const的习惯,当意识到某个变量在使用过程中是不变量时,要有意识的将其声明位const,这有利于其他程序员理解程序。
const修饰指针:

const type* virName:指针指向可以修改,但是指针指向的值不能修改
type* const virName:指针指向不能修改,但是指针指向的值可以修改
const type* const virName:指针指向和其值都不能修改

2.1 函数的返回值为const

class Object{...};
const Object operator*(const Object& o1,const Object& o2);
//上述重写了自定义方法的*操作,返回值是const Object类型

Object a,b,c;
(a*b) = c//ERROR!(a*b)的返回值是const,只能作为右值赋值,不能作为左值对其再次进行赋值
//这里的赋值操作会调用operator=(),复制拷贝构造

这样可以很好的避免表达式转换成bool的类型的错误
如if((a*b) = c)错将==写成=。这个编译器就会报错。

2.2 被忽略顶层const

当使用auto来声明变量时,会忽略顶层const,但是底层的const不会被忽略

const int ci = 0,&cr = ci;
auto b = ci;// b是int类型
auto c = cr;// c是int类型
auto e = &ci;// e是指向int常量的指针

b,c就是忽略了顶层的const,e对于底层的const没有忽略

2.3 使用typedef造成的错误

typedef char* pstring;
const pstring cstr = 0;// 指向char的常量指针
const pstring *ps;		//一个指针,指向char的常量指针

如果将pstring 换成 char* 带入

const char* cstr = 0;// 一个指针,执行那个char常量

这和本意完全不同,带入后,数据类型就是char,*成了声明符的一部分。

3. constexpr修饰

constexpr double Pi(){ return 22.0 / 7; }
constexpr double Area(){ return 2 * Pi(); }

constexpr修饰的函数是在编译时就进行运算的。
有利于减少应用程序的运行时间:在c++11时,使用constexpr时在编译时就进行运算,而上面代码第二行如果使用const来修饰,则会在运行时才进行计算。
在c++11之前不支持在编译期间就进行运算的函数,使用了constexpr可以提升优化应用程序的可能性。

3.1 顶层常量

constexpr会将常量设置为顶层常量

const char* q = nullptr;	//指向char常量的指针
constexpr char* p = nullptr;//指向char的指针常量

也就是说,当constexptr修饰指针时,仅仅和指针相关,和指针指的对象无关;

4. enum修饰

enum Rainbow
{
    red = 0,
    blue,
    orange,
    yellow,
    indigo,
    violet
};
enum Pi
{
	PI = 3.14
};
int main()
{
	cout<<blue<<endl;
	Rainbow r1 = orange;
	cout<<r1<<endl;
	cout<< 2 * PI<<endl;
}

枚举常量值,定义一个枚举常量可以在其中选择,可以将其每个常量都进行赋值。也可以指赋值一个,后面的每一个都会比前一个多一,也可以都不进行赋值,默认第一个位0;

5. #define

#define PI 3.14

使用宏定义的形式来进行常量赋值,当遇到PI时将其转换为后面的PI。
但是不推荐使用该方法,甚至都已经被摒弃,因为当进行转换的时候不会进行类型检查,这会导致出现大错误。
当代码在编译运行的时候出现的错误,仅仅会提示3.14出现了错误,这很不利于去代码的检错和修正。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值