感觉自己的时间都在不知不觉中浪费,不漫无目的的瞎耗了,还是认真做自己真正感兴趣的事吧!
看了别人的许多bolg,学到了挺多的,下面是const的详解(c++primer真是本好书)
1.const用于普通的数据类型
const int a=32; //对于const类型的数据必须在定义的时候初始化
const int a;
a=12; //too late to initialize
2.const用于指针类型
一:指针指向的内容是常量
int a=32;
const int *p=&a; //p指向的内容是一个常量,不允许改变
int const *p=&a; //这个表达式跟上面的一模一样,我比较喜欢上面的那种
*p++; *p=42; //invalid because pt points to a const int
a=42 //valid 可以变量来改变这个值
int b=42;
p=&b; // p指向的内容不变,但这意味着可以让它指向别的变量的地址
二:指针本身是常量
int a=32;
int * const p=&a; //p本身是一个常量,不允许改变
int b=42
p=&b; //invalid 指针p是一个常量,无法指向别的地址
*p++ ,*p=42; //valid 指针不能指向别的地址,但是这意味着我们可以改变它指向的值
三:指针本身和指针所指向的内容都为常量
int a=32;
const int * const p=&a //p指向的内容和自己本身都不能被更改
3:指针赋值的问题
C++禁止将指向const的地址赋给非const的指针
int a=32;
const int *p=&a;
int *q=p; //可以通过改变*q来改变*p的值,it's ridiculous
可以将const的地址赋给const的指针
4:const用于函数中
一:const用于函数的参数
void function(const int a); //参数的值在函数中不能改变
void function(const int *a);//参数指针所指向的内容在函数中不能改变
void function(int * const a); //参数指针在函数中不能改变
void function(const int &a); //参数引用在函数中不能改变
void function(const class &A);//参数对象引用也在函数中不能改变
二:const用于函数的返回值
const int * function();
const int *p=function(); //p指向的内容不能改变
int *const function();
int *const p=function(); //p本身不能被改变
三:const用于函数的末尾
void function(int a,int b) const;
//这是对于类而言的
//常成员函数,不改变对象的成员变量,也不调用类中任何非const成员函数
4:对于类而言的const
一:如果在类中声明了一个const变量,则只能用初始化列表的方法才能初始化
class A
{
private: const int a;
public:
A (int x): a(x) { };
}
二:常成员函数
void function(int a,int b) const; //这是对于类而言的
//常成员函数,不改变对象的成员变量,也不调用类中任何非const成员函数
三:const对象
const A a //a中的任何对象度不能被修改,对于对象指针与引用也是一样的
//a中任何非常成员函数都不能调用,因为任何非const成员函数会有修改成员变量的企图
const的使用注意事项:
要大胆的使用const,这将给你带来无尽的益处,但前提是你必须搞清楚原委;
·要避免最一般的赋值操作错误,如将const变量赋值;
·在参数中使用const应该使用引用或指针,而不是一般的对象实例;
·const在成员函数中的三种用法(参数、返回值、函数)要很好的使用;
·不要轻易的将函数的返回值类型定为const;
·除了重载操作符外一般不要将返回值类型定为对某个对象的const引用;
·任何不会修改数据成员的函数都应该声明为const类型。