1. 修饰一般变量,const int a = 10; 表示此变量不能被修改,简单易懂,不多说
2. 修饰指针,主要是下面三种
const int *cp1 = &a; //修饰int,不能修改指针指向的内存的值,即a的值
int const *cp2 = &a; //同上
int *const cp3 = &a; //修饰*, 指针本身不能修改,即不能改变指针指向a还是b
助记:看const左边第一位,是什么类型就是修饰什么,左边没有找右边第一个
int a = 10; int b = 20; std::cout << "a = " << a << std::endl; std::cout << "b = " << b << std::endl; //1 const int *cp1 = &a; std::cout << "*cp1 = " << *cp1 << std::endl; cp1 = &b; // 可以修改指针本身,即指向a还是b可以改 //*cp1 = 1111; //error, 修饰int,不能修改指针指向的内存的值,即a的值 std::cout << "after cp1=&b,*cp1 = " << *cp1 << std::endl; //2 the same as 1 int const *cp2 = &a; std::cout << "*cp2 = " << *cp2 << std::endl; cp2 = &b; //*cp2 = 2222; //error std::cout << "*after cp2=&b,*cp2 = " << *cp2 << std::endl; //3 int *const cp3 = &a; std::cout << "*cp3 = " << *cp3 << std::endl; //cp3 = &b; //error, 修饰*, 指针本身不能修改,即不能改变指向a还是b *cp3 = 3333; // 可以修改指针指向的内存的值,即a的值 std::cout << "after*cp3=3333,*cp3 = " << *cp3 << std::endl; std::cout << "a = " << a << std::endl; std::cout << "b = " << b << std::endl;
3. 修饰类成员函数
const int setValue(const int value) const
从左到右,1. 返回值不能改
2. 参数不能改
3. 常函数,函数成员变量不能被修改,如需要更改,请在成员变量前加上mutable
class A { public: A():m_a(0) ,m_b(0){} virtual ~A(){} public: const int geta(){return m_a;} //返回值不能被修改 int setValue(const int value) const { //m_a = value; //error 函数后面有const,常函数,不能修改成员变量 m_b = value; // 如果要修改,需要加上mutable修饰成员变量 //value++; //error const 修饰函数参数,不能被修改 return value; }
private: int m_a; mutable int m_b; };
个人总结:
实际应用中,一般用const来修饰自定义的复杂的数据结构或者类的指针或者引用,用以进行函数传参或者返回,避免传参时进行数据拷贝或者生成临时对象,影响程序性能,也常建议这么处理,尽量使用const 指针或者引用来处理传参, 尽量最大程度的获得编译器的优化。
对于一般的基础类型变量本身就是进行值传递时,意义不大。