文章目录
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出现了错误,这很不利于去代码的检错和修正。