在类成员函数中,有部分函数会在函数形参后面加入const作为该函数的约束,将该函数约束为常量函数,假设所属类名为date,函数为getday,无输入实参,其函数形式为:
int date::getday() const {}
函数后面的const主要控制该类为常量,换句话说,就是在这个函数中,不会修改类的任意成员。为了更加了解这个约束,我们先了解下this指针。
(一)*this指针
this指针是对象在类成员函数中的引用,它隐式地指向调用该函数的对象的地址,当我们通过某个对象调用类的成员函数时,则this被请求该函数的对象地址所初始化。
举个例子,假设类date中有成员变量day,在主函数中,创建一个date类对象D,调用函数getday,该函数的编写为:
int date::getday() const { return this->day;}
当调用函数getdate时,this便被赋为对象D的地址,并且返回该对象的成员day。因此this在成员函数中的作用就是替换对象,便于函数中的使用。
因此const对函数的约束,其实是对调用该函数的对象的约束,即不能在函数中无法改变该对象的任何成员。
(二)如果函数中我不改变成员,那么加const是否就可有可无?
对于这个问题,答案是最好加上。
先来对比两个初始化语句:
int A;
const int B;
int *C=&B; //出错,指向常量的指针无法初始化指向非常量指针
const int *D=&A; //对,指向非常量的指针可以初始化指向常量的指针
引用初始化与指针初始化时,只允许用指向非常量的指针去初始化指向常量的指针,无法用指向常量的指针去初始化指向非常量指针,因为对于前者,当修改非常量的值时候,常量指针的值也跟着改变,这跟常量的概念刚好背道而驰。这个解释对于后者是否矛盾?当用指向普通变量的指针去初始化指向常量的指针时,当修改该普通变量的值时,也能修改到指向常量的指针的值,该初始化只是说明我们无法通过该常量指针来修改原来的普通变量,但是该变量能通过其他途径来修改。
这个说明有点绕,现在换成上面的常量成员函数,我们知道this是对象的地址,在调用该函数时,已经隐式用对象的地址初始化this指针,按照上面逻辑,若将this定义为指向常量的指针,那么它可以由指向常量的指针来初始化,也可以由指向普通变量的指针来初始化,因此对于常量成员函数而言,可以被常量对象和非常量对象所调用。但是对于非常量对象而言,由于指向常量的this指针无法被指向普通变量的指针所初始化,因此主函数中定义了该类的常量对象,当调用没用const约束的函数时,系统将会报错。
(三)结论
1、若某个类成员函数中不会修改到类的任何值,那么一般都要将其设置为const函数。
2、常量成员函数能被普通对象和常量对象调用。
3、若定义某个类的常量对象,那么该对象只能调用该类中的常量成员函数。
若有matlab编程或者算法研究等技术需求,可加QQ(3141104423)或者加QQ群(479888200)交流平台
网友评论