美文网首页
为何C++类成员函数形参后面会加const

为何C++类成员函数形参后面会加const

作者: 技术烧 | 来源:发表于2017-11-30 22:17 被阅读0次

            在类成员函数中,有部分函数会在函数形参后面加入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)交流平台

    相关文章

      网友评论

          本文标题:为何C++类成员函数形参后面会加const

          本文链接:https://www.haomeiwen.com/subject/djcebxtx.html