1、const用法及作用
1.1、const与指针
const放在类型前面表示指针指向的是一个常量,放在*后面表示这是一个常量指针。
const int* p;//p指向的是一个常量
int* const p;//p是一个常量指针,不是修改它的值
1.2、const修饰函数参数
const修改函数参数表示参数不可修改,可起到保护的作用。
void foo(const int a)
{
a=10;//error
}
1.3、const修改成员函数
const修改成员表示该函数不能修改任何成员变量的值,同时不能调用任何非const修饰的函数,因为没有const修饰的函数会修改成员变量的值。const修饰函数放在最后面。
class demo
{
private:
int a;
pulibc:
void foo() const
{
a=10;//error
}
};
1.4、const修饰函数返回值
const修饰函数返回值有三种情况:
第一种,函数返回指向常量的指针变量,即const int*,这种情况接收返回值的也必须是指向常量的指针,指针变量或指针常量都可以(变量可以赋给变量,也可以赋给常量)。
第二种,函数返回指向变量的常量指针,即int* const,这种情况接收返回值的可以是变量指针,也可以是常量指针(常量赋给变量,也可以赋给常量)。指针指向变量或常量都可以(指向变量的指针也可以赋给指向常量的指针)。
第三种,函数返回指向常量的常量指针,即const int* const,这种情况和第一种情况一样,接收返回值的必须是指向常量的指针,可以是常量指针也可以是变量指针。(常量可以赋给变量,也可以赋给常量)。
第四种,函数返回常量,即const int。这种写上const没什么意义,因为值传递都是复制的。
前面三种看起来有点绕,总结起来就是两句话:
一、常量可以赋给常量和变量。
二、指向常量的指针必须必须赋给指向常量的指针,指向变量的指针可以赋给指向变量或常量的指针。
const char* foo()
{
const char a = 'c';
const char* p = &a;
return p;
}
char* const foo2()
{
char a = 'c';
char* const p = &a;
return p;
}
const char* const foo3()
{
const char a = 'c';
const char* const p = &a;
return p;
}
int main()
{
//char* p = foo(); //error,指向常量的指针不能赋给指向变量的指针
const char* p = foo(); //指向常量的指针
const char* const p4 = foo(); //把变量指针赋给常量指针,合法
char* p2 = foo2(); //把常量指针赋给变量指针,合法
char* const p3 = foo2(); //常量指针
const char* p5 = foo2(); //指向变量的指针可以赋给指向常量的指针
const char* const p6 = foo3(); //指向常量的常量指针
const char* p7 = foo3(); //指向常量的变量指针
//char* const p8 = foo3(); //指向变量的常量指针,error
//char* p9 = foo3(); //指向变量的变量指针,error
cin.get();
return 0;
}
1.5、const之于函数的健壮性
一、修饰函数参数
按值传递的参数加上const是没意义的,因为参数传递的时候是拷贝的。按引用传递时加上const保证传出参数的同时对象也不会被更改。
二、修饰函数返回值
返回指向常量的指针只能用指向常量的指针接收,避免指针指向的对象被更改。
三、修饰成员函数
保护成员变量不被修改。