const关键字
const 修饰成员变量
修饰变量
具有常属性,可以在定义数组的时候用该变量定义,每次取值从寄存器中取,在编译过后,直接将对应的值,替换到当前变量的位置。与之相对的是volatile。被这个关键字修饰的话,代表告诉了编译器,这个变量时随时可能被修改的。防止编译器优化,每次读取该值时,从内存中读取。而不是从编译器优化的寄存器中读取。C++中,被const修饰的变量,会在编译期间将对应的变量,直接替换为该变量的值。但是C语言中不会。
const离谁近,谁就不能被修改;
const修饰一个变量时,一定要给这个变量初始化,若不初始化,在后面也不能初始化。
修饰指针
#include<iostream>
using namespace std;
int main(){
int a1=3; ///non-const data
const int a2=a1; ///const data
int * a3 = &a1; ///non-const data,non-const pointer
const int * a4 = &a1; ///const data,non-const pointer
int * const a5 = &a1; ///non-const data,const pointer
int const * const a6 = &a1; ///const data,const pointer
const int * const a7 = &a1; ///const data,const pointer
return 0;
}
const修饰指针变量时:
(1)只有一个const,如果const位于*
左侧,表示指针所指数据是常量,不能通过解引用修改该数据;指针本身是变量,可以指向其他的内存单元。
(2)只有一个const,如果const位于*
右侧,表示指针本身是常量,不能指向其他内存地址;指针所指的数据可以通过解引用修改。
(3)两个const,*
左右各一个,表示指针和指针所指数据都不能修改。
const修饰成员函数
修饰函数返回值
const int add(int a, int b)
放在返回值前无意义,因为返回的值本就是一个临时变量。所以const修饰也没有任何作用
修饰参数列表
放在参数列表前修饰。用来保护传进来的参数,保证尽可能的不被修改。
放在函数后
放在函数后面。用来修饰类的成员函数中的this所指向的,也就是保护类成员(非静态成员除外)不被修改。
同时,没有const修饰的函数可以调用const修饰的成员函数,但是被const修饰的成员函数不可以调用非const修饰的成员函数。而且非const定义出来的对象可以调用const与非const函数,但是const定义出来的对象只能调用const修饰的函数,不能调用非const函数,因为他有可能对对象进行修改。
类成员函数中,后面加与不加const也可以形成重载。const修饰的对象调用的是const修饰函数,非const修饰的对象调用的是非const函数。
c++ 函数前面和后面 使用const 的作用:
前面使用const 表示返回值为const
后面加 const表示函数不可以修改class的non-static成员
Tips
对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const引用传递”,目的是提高效率。例如将voidFunc(A a) 改为voidFunc(const A &a)。
对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如voidFunc(int x) 不应该改为voidFunc(const int &x)。
任何不会修改数据成员的函数都应该声明为const类型
如何在内存0x0018ff44地址处写一个四字节整数20,用指针和引用变量实现?
#include<iostream>
using namespace std;
int main()
{
//指针变量
int *p = (int *)0x0018ff44;
*p = 20;
//引用变量
int* const &q = (int *)0x0018ff44;
*p = 10;
//其中间生成了临时量,我们可以用如下伪代码来说明:
//int *const ptemp = (int *)0x0018ff44;
//int *const &q = ptemp;
}