常量函数由非常量对象调用。为什么?

时间:2018-11-18 20:54:43

标签: c++ const member-functions const-correctness this-pointer

我是C ++的新手,面对常量对象的问题。我已经声明了一个名为 function 的常量成员函数(并且据我了解到, constant函数只能由常量对象调用),但是这里的常规对象称为常量宾语。请解释为什么会这样。 代码在这里

myClass.h

#ifndef MYCLASS_H
#define MYCLASS_H

class myClass
{
    public:
        void function() const;  
};

#endif

myClass.cpp

#include "myClass.h"
#include<iostream>
using namespace std;

void myClass::function() const{
    cout<<"this is a constant object";
}

main.cpp

#include <iostream>
using namespace std;
#include "myClass.h"

int main() {
    myClass obj;
    obj.function();

    return 0;
}

请帮助我。 谢谢

2 个答案:

答案 0 :(得分:6)

这就是C ++的工作方式。可以在非const对象上调用const成员函数,因为const正确性不能以这种方式破坏。不能的是在const对象上调用非const成员函数。

请注意,如果您的非常量重载为function(),则会调用该常量。

答案 1 :(得分:4)

  

据我了解,常量函数只能由a调用   常数对象

不!

反之亦然:

  • 一个const成员函数保证只读取对象,因此即使无法更改也可以调用它;
  • 一个非const成员函数(例如,称为“ MF”)可以读取和修改对象,因此:

    • 它既不能从const成员函数中调用(也称为“ CMF”):由函数(在这里为“ CMF”)调用的函数不应违反已作出的承诺,而“ MF”有可能违反承诺;
    • 不能在const对象上调用它,const对象在其构造完成时一直保持不变,直到销毁为止(在构造过程中,声明为const的对象还不是常数,因为构造函数需要对其进行设置)。

因此 const限定成员函数可以应用于任何对象;限制是这些const成员函数可以调用什么。