Вызов неконстантной функции для константного объекта - PullRequest
3 голосов
/ 11 июля 2019

Я читаю C ++ Primer 5-е издание, стр. 258. Вопрос в том, может ли const-объект вызывать свою неконстантную функцию-член, даже если эта функция-член не изменяет свои данные?

Sales_data.h

#include <iostream>
#include <string>

struct Sales_data {
    // data members
    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;

    // memeber functions
    const std::string isbn() const { return bookNo; }
    Sales_data& combine(const Sales_data&);
    double avg_price() const { // *
        if (units_sold) {
            return revenue / units_sold;
        }
        return 0.0;
    }
};

std::ostream& print(std::ostream &os, const Sales_data& data) {
    os << data.isbn() << " " << data.units_sold << " " << data.avg_price();
    return os;
}

use_Sales_data.cpp

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

int main(){
    Sales_data data;
    data.bookNo = "CSAPP";
    data.units_sold = 2;
    data.revenue = 50;
    print(cout, data);
}

Когда я удаляю const для функции avg_price, код не компилируется. Но я думаю, что функция avg_price() не изменяет объект. Я предполагаю, что в списке параметров print я объявил Sales_data объект как const, а C ++ не позволяет const-объекту вызывать свою функцию-неконстантный член. Это тот случай?

1 Ответ

4 голосов
/ 11 июля 2019

Да. Запомните две вещи-

  1. Если функция не постоянная, она может вызываться только непостоянным объектом.
  2. Если функция постоянна, ее можно вызывать для любых объектов (я имею в виду любые постоянные или непостоянные объекты.)

Причина:

  1. Если функция не постоянна, то ей разрешено изменять значения объекта, для которого она вызывается.Таким образом, компилятор не позволяет создать такой шанс и не позволяет вам вызывать непостоянную функцию для постоянного объекта, так как постоянный объект означает, что вы больше ничего не можете изменить.Таким образом, компилятор позволяет вызывать его только для неконстантного объекта, так как этот объект может быть изменен.
  2. Если функция сама является константой, то она обещает, что она не изменит ничего объекта накоторый это называется.Поэтому компилятору не важно, вызываете ли вы постоянную функцию для постоянного или непостоянного объекта, поскольку сама функция не может изменить объект.
...