七.const的作用
说明
- 常类型也称为const类型,是指使用类型修饰符const说明的类型。
- const是C和C++中常用的关键字,在C语言中,它主要用于定义变量为常类型以及修饰函数参数与返回值(变量、函数参数、返回值)。而在C++中还可以修饰函数的定义,定义类的成员函数。
- 常量必须初始化。
- 编译器一般不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率很高。
#define和const的区别
- #define不进行类型检查,只是简单的宏替换。
- const常量有数据类型,进行安全性检查。
- const定义常量从汇编的角度看,只是给出了对应的内存地址,而#define给出的是立即数,因此const常量在程序运行过程中只有一份复制品(const常量内存只分配一次),而#define定义的常量在内存中有若干个复制品。
常指针
- const int *A;//const修饰指向的对象,A可变,A指向的对象不可变。
- int const *A;//const修饰指向的对象,A可变,A指向的对象不可变。
- int *const A;//const修饰指针A,A不可变,A指向的对象可变。
- const int *const A;//指针A和A指向的对象都不可变。
#include<iostream>
using namespace std;
int main(int argc, char* argv[]) {
int data = 10;
int data2 = 30;
int *p = &data2;
//************第一种情况************
const int *A = &data;
cout << *A << endl; //10
//*A = 20; //错误:A指向的对象不可变
A = p; //A可变
cout << *A << endl; //30
//************第二种情况************
int *const B = &data;
cout << *B << endl; //10
*B = 20; //B指向的对象可变
cout << *B << endl; //20
//B = p; //错误:B不可变
//************第三种情况************
const int *const C = &data;
cout << *C << endl; //10
//*C = 20; //错误:C指向的对象不可变
//C=P; //错误:C不可变
getchar();
return 0;
}
修饰类的成员函数
- 不改变类的数据成员(只读函数)。
- 当给类的数据成员加上mutable后,修饰为const的成员函数就可以修改它了。
#include<iostream>
#include<string>
using namespace std;
class A {
public:
A(int val=0):val(val){}
int get() const {
--val; //出错:不能改变类的数据成员
return val;
}
private:
int val;
};
int main(int argc, char* argv[]) {
A a(10);
cout << a.get() << endl;
getchar();
return 0;
}
#include<iostream>
#include<string>
using namespace std;
class A {
public:
A(int val=0):val(val){}
int get() const {
--val; //正确
return val;
}
private:
mutable int val; //注意mutable
};
int main(int argc, char* argv[]) {
A a(10);
cout << a.get() << endl;
getchar();
return 0;
}
常引用
- 常引用也称为const引用。引入常引用是为了避免在使用变量的引用时,在毫不知情的情况下改变了变量的值,引起程序错误。
- 常引用的主要用途
- 用做普通变量的只读属性的别名,表示同一个地址空间。
- 用于函数的形参。既利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变。
- 引用初始化
- 当初始化值是一个左值(可以取得地址)时,可直接引用;
- 当初始化值为右值(常量),则只能对一个常引用赋值。赋值过程:先将值隐式转换为类型T,然后将这个转换结果存放在一个临时对象中,最后用这个临时对象来初始化这个引用常量。
- 不能给非常量引用赋右值。
#include<iostream>
using namespace std;
void calc(const int& a) {
//a += 10; //错误:不能改变常量的值
cout << a << endl;
}
int main(int argc, char* argv[]) {
//********************作为普通变量的别名**************************
int a = 10;
cout << a << endl; //a=10
const int& b = a;
cout << b << endl; //b=10
a = 20;
cout << a << endl; //a=20
cout << b << endl; //b=20。b相当于是a的别名,表示同一个地址空间,改变a的值就相当于改变b的值
//作为函数形参
calc(a);
cout << a << endl; //a=10
//*********************引用初始化**************************
int& c = a;
cout << c << endl; //c=20
//int& d = 20; //错误:不能给非常量引用赋右值。
const int& d = 20;
cout << d << endl; //d=20。正确:常量引用可以赋右值
//过程相当于:
//int temp = int(20);
//const int& d = temp;
getchar();
return 0;
}