постоянная функция вызывается непостоянным объектом.Зачем? - PullRequest
0 голосов
/ 18 ноября 2018

Я новичок в c ++ и столкнулся с проблемой с постоянными объектами. Я объявил постоянную функцию-член с именем function (и как я узнал, что постоянная функция может вызываться только постоянным объектом ), но здесь обычный объект вызывает постоянный объект. Пожалуйста, объясните, почему это происходит. Код здесь

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 голосов
/ 19 ноября 2018

как я узнал, что постоянная функция может быть вызвана только постоянным объектом

Нет!

Это наоборот :

  • константная функция-член обещает только чтение объекта, поэтому ее можно вызывать, даже если изменения невозможны;
  • неконстантная функция-член (скажем,"MF") может читать и изменять объект, поэтому:

    • он не может быть вызван ни из константной функции-члена (скажем, с именем "CMF"): функции, вызываемые функцией (здесь "CMF ") не должен нарушать данное обещание, а" MF "рискует нарушить обещание;
    • его нельзя вызывать для объекта const, который является постоянным после завершения его строительства и до разрушения (во время строительстваобъявленный объект const еще не является константой, так как конструктор должен его настроить).

Итак, квалифицированная константная функция-член может быть применена к любому объекту ;ограничение на то, что могут вызывать эти функции-члены const.

0 голосов
/ 18 ноября 2018

Так работает C ++. Можно вызывать функцию-член const для неконстантного объекта, потому что правильность const не может быть нарушена таким образом. Что не в порядке, так это вызов неконстантной функции-члена для константного объекта.

Обратите внимание, что если бы у вас была неконстантная перегрузка function(), она была бы вызвана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...