定义常量
指针相关
(1)指针本身是常量不可变
char* const p;
(2)指针所指向的内容是常量不可变
const char *p;
(3)两者都不可变
const char* const p;
关于指针和引用:
1.
const int* p = &x; //声明p为指向常量x的指针,p指向的对象不能被修改,但它可以指向任何地址的常量,例如:
int i = 10;
const int *p = &i;
*p = 11; // wrong
i = 11; // correct
2.int const *p =&x; // 与用法1同
3.int* const p = &x; // 声明p为一个常量指针,它指向x,p这个指针的指向不能被修改,但是它指向的地址的内容可以修改
4.const int* const p = &x; // 综合用法1和用法2,p是一个指向常量的常量性指针
5.const double& v; // 该引用所引用的对象不能被更新
总结:如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。
函数相关
(1)const修饰函数参数
a.传递过来的参数在函数内不可以改变(无意义,因为Var本身就是形参)
void function(const int Var);
b.参数指针所指内容为常量不可变
void function(const char* val);
c.参数指针本身为常量不可变(也无意义,因为char* val也是形参)
void function(char* const val);
d.参数为引用,为了增加效率同时防止修改。修饰引用参数时:
void function(const Class& val); //引用参数在函数内不可以改变
void function(const TYPE& val); //引用参数在函数内为常量不可变
补充:a.对于非内部数据类型的输入参数,应该将“值传递”的方式改为“const 引用传递”,目的是提高效率。
例如:将void Func(A a) 改为void Func(const A &a)。
因为函数体内将产生A 类型的临时对象用于复制参数a,而临时对象的构造、复制、析构过程都将消耗时间;“引用传递”仅借用一下参数的别名而已,不需要产生临时对象。
b.对于内部数据类型的输入参数,不要将“值传递”的方式改为“const 引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。
例如:void Func(int x) 不应该改为void Func(const int &x)。
因为内部数据类型的参数不存在构造、析构的过程,而复制也非常快,“值传递”和“引用传递”的效率几乎相当。
类相关
(1)const修饰成员变量
1°const修饰类的成员函数,表示成员常量不能被修改/不会修改数据成员,同时它只能在初始化列表中赋值。//第一次知道
class A {
…
const int n; //成员常量不能被修改
…
A(int x): n(x) { } ; //只能在初始化列表中赋值
}
初始化const int类型(没有static),在类的构造函数上初始化
Class Test {
Public:
Test():b(23) {//构造函数上初始化b的值为23
}
private:
const int b ;
}
2°使用const修饰的变量必须初始化,在类中又不能在定义时初始化,
如;
class {
private:
int a = 10;
const int b = 10;
static const int c = 10;
//这样初始化都是错的,
}
3°初始化static const int这个类型的(带有static的),在类的外面初始化
class Test {
private:
static const int c;
};
const int Test::c=10; //类的外部初始化c为10
4°*const定义的对象变量*只能作用于这个程序该C/C++文件,不能被该程序的其他C/C++文件调用,
如file1.cpp中 const int val;
在file2.cpp中, extern int val; //错误,无法调用,
要想const定义的对象变量能被其他文件调用,定义时必须使用extern修饰为
extern const int val;
非const变量默认为extern,要是const能被其他文件访问必须显示指定为extern
(2)const修饰成员函数
const修饰类的成员函数,则该成员函数不能修改类中任何非const成员函数。一般写在函数的最后来修饰。
class A {
…
void function()const; //常成员函数, 它不改变对象的成员变量.
//也不能调用类中任何非const成员函数。
}
对于const类对象/指针/引用,只能调用类的const成员函数,因此,const修饰成员函数的最重要作用就是限制对于const对象的使用。
a. const成员函数不被允许修改它所在对象的任何一个数据成员。
b. const成员函数能够访问对象的const成员,而其他成员函数不可以。
(3)const修饰类对象/对象指针/对象引用
·const修饰类对象表示该对象为常量对象,其中的任何成员都不能被修改。对于对象指针和对象引用也是一样。
·const修饰的对象,该对象的任何非const成员函数都不能被调用,因为任何非const成员函数会有修改成员变量的企图。
例如:
class A {
void func1();
void func2() const;
}
const A aObj;
aObj.func1(); ×
aObj.func2(); 正确
const AAA* aObj = new AAA();
aObj-> func1(); ×
aObj-> func2(); 正确
ps:以上转载改编自
关于C++ const 的全面总结
总结const的用法
const的常见用法