c++中的const和java中的final类似, 表示不可变的意思, 但java中的final仅仅用在这几个地方:
(1)修饰变量, 如:
public final int age; // 不可变成员
public static final int TYPE_A = 1; // 常量
(2)修饰方法, 表示方法不可被Override覆盖, 即去除方法的多态性.
(3)修饰局部变量, 也是不可变.
(4)修饰类, 表示类不可被继承
而c++中的const功能就多了:
(1)修饰全局变量: 表示变量值不可修改
Main.cpp
#includeusing namespace std; const int g_int = 10; int main(void) { g_int = 11; cout << "g_int:" << g_int << '\n'; return 0; }
编译的话会得到assignment of read-only variable 'g_int'的编译错误, 表示g_int的值是只读的, 不可修改.
(2)修饰局部变量: 表示变量值不可修改
Main.cpp
#includeusing namesapce std; int main(void) { const int i = 10; i = 11; cout << "i:" << i << '\n'; return 0; }
编译时会得到assignment of read-only variable 'i'的错误, 表示i是只读的, 值不可被修改.
(3)
(3-1)修饰指针变量的值: 表示指针变量的值不可修改, 也这样的变量也可以叫做"指针常量".
(3-2)修饰指针变量所指向的内容: 表示不能修改指针变量所指向的内容, 这样的变量也可以叫做. "常量指针"
Main.cpp
void test( int * const p1, // 指针常量 int const * p2, // 常量指针 const int *p3 // 常量指针 ) { // 修改变量的值 int i = 10; // p1 = &i; // 指针常量, 变量值不可修改 p2 = &i; p3 = &i; // 修改所指内容 *p1 = 10; // *p2 = 10; // 常量指针, 所指内容不可修改 // *p3 = 10; // 常量指针, 所指内容不可修改 } int main(void) { int a = 10; int b = 20; int c = 30; test(&a, &b, &c); }
(4)
(4-1)修饰对象, 表示对象值不可修改
(4-2)修饰对象引用, 也表示对象值不可修改
Main.cpp
struct Data { int m_int; } void test( const Data obj1, Data const obj2, // obj1和obj2的效果相同 const Data &obj3, Data const &obj4 // obj3和obj4的效果相同 // Data & const obj5 // 没有这样的语法 ) { //obj1.m_int = 1; //obj2.m_int = 2; //obj3.m_int = 3; //obj4.m_int = 4; } int main(void) { Data d1; Data d2; Data d3; Data d4; test(d1, d2, d3, d4); return 0; }
会得到编译错误, obj1-4的值均不可修改.
(5)放在方法的返回类型前:
(5-1)修饰基本数据类型的返回值, 如int, char, bool, 没有实际意义, 因为仅仅是一个值, 返回的值赋给某个变量后, 那个变量还是可以被修改.
Main.cpp
#includeusing namespace std; int constMethod() { return 3; } int main(void) { int i = constMethod(); cout << "i:" << i << '\n'; i = 2; cout << "i:" << i << '\n'; }
可以正常编译并运行, 且第一次输出3, 第二次输出2.
(5-2)修饰指针类型的返回值
Main.cpp
class Data { public: int m_int; } class Const { private: Data *m_pt; public: void init(void) { m_pt = new Data(); } void finalize(void) { delete m_pt; } const Data * getPt_01() { return m_pt; } // 返回常量指针 Data const * getPt_02() { return m_pt; } // 返回常量指针 Data * const getPt_03() { return m_pt; } // 返回指针常量 } int main(void) { Const c; c.init(); // error: invalid conversion from 'const Data*' to 'Data*', 常量指针无法赋值给普通指针, 因为普通指针可以修改指针所指内容, 而常量指针不可以 // Data *pt_01 = c.getPt_01(); // Data *pt_02 = c.getPt_02(); Data *pt_03 = c.getPt_03(); // 下面3个都可以 const Data *pt_04 = c.getPt_01(); const Data *pt_05 = c.getPt_02(); const Data *pt_06 = c.getPt_03(); c.finalize(); return 0; }
(5-2)修饰引用类型的返回值
Main.cpp
class Data { public: int m_int; } class Const { private: Data m_obj; public: const Data & getObj_01() { return m_obj; } Data const & getObj_02() { return m_obj; } //Data & const getObj_03() // 没有这样的写法 } int main(void) { Const c; Data d_01 = c.getObj_01(); Data d_02 = c.getObj_02(); const Data d_03 = c.getObj_01(); const Data d_04 = c.getObj_02(); return 0; }
(6)放在方法的最后: 表示该方法不会修改对象的数据
Main.cpp
class Const { private: int m_int; public: void setInt(int i) const { m_int = i; } } int main(void) { Const c; // c.setInt(2); return 0; }
会得到编译错误, error: assignment of member 'Const::m_int' in read-only object, 提示在只读方法上对变量m_int直行了赋值.
(5)修饰类成员变量: 表示成员变量值不可修改
Const.h, 注意const变量只能在初始化列表上进行初始化, 在构造器内部是不行的(那时c++编译器不认为是初始化了, 而是属于赋值阶段了)
#ifndef CONST_H_ #define CONST_H_ class Const { private: const int m_int; public: Const(int i); void setInt(int i) { // error: assignment of read-only member 'Const::m_int' // m_int = i; } } #endif
Const.cpp
Const::Const(int i) : m_int(i) { }
Main.cpp
#include "Const.h" int main(void) { Const c(1); c.setInt(2); return 0; }
Const.h会得到编译错误: error: assignment of read-only member 'Const::m_int', 提示m_int的值是只读的, 不可修改
(6)修饰类的static变量: 表示static变量值不可修改
Const.h
#ifnded CONST_H_ #define CONST_H_ class Const { private: static const int s_int; public: static void setInt(int i) { // error: assignment of read-only variable 'Const::s_int' //s_int = i; } } #endif
Const.cpp
const int Const::s_int = 10;
Main.cpp
#include "Const.h" int main(void) { Const c; c.setInt(11); Const::setInt(12); return 0; }
Const.h会遇到编译错误, error: assignment of read-only variable 'Const::s_int', 提示s_int是只读的, 其值不可修改.