Panggil fungsi non-const pada objek const

Saya membaca C++ Primer edisi ke-5 halaman 258. Pertanyaannya adalah, dapatkah objek const memanggil fungsi anggota non-constnya, meskipun fungsi anggota tersebut tidak mengubah datanya?

Penjualan_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;
}

gunakan_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);
}

Ketika saya menghapus const untuk fungsi avg_price, maka kode tidak dapat dikompilasi. Tapi menurut saya fungsi avg_price() tidak mengubah objek. Dugaan saya adalah, dalam daftar parameter print, saya mendeklarasikan objek Sales_data sebagai const dan C++ tidak mengizinkan objek const memanggil fungsi anggota nonconstnya. Apakah ini masalahnya?


person yyFred    schedule 11.07.2019    source sumber


Jawaban (1)


Ya. Ingat dua hal-

  1. Jika fungsinya tidak konstan, maka hanya dapat dipanggil oleh objek yang tidak konstan.
  2. Jika fungsinya konstan, ia dapat dipanggil pada objek apa pun (maksud saya objek apa pun yang konstan atau tidak konstan.)

Alasan:

  1. Jika fungsinya tidak konstan, maka fungsi tersebut diperbolehkan untuk mengubah nilai objek yang dipanggil. Jadi kompiler tidak mengizinkan untuk menciptakan peluang ini dan mencegah Anda memanggil fungsi non-konstan pada objek konstan, karena objek konstan berarti Anda tidak dapat mengubah apa pun lagi. Jadi kompiler hanya mengizinkan Anda untuk memanggilnya pada objek non-konstan karena objek ini dapat dimodifikasi.
  2. Jika fungsi itu sendiri konstan, maka fungsi tersebut menjanjikan bahwa fungsi tersebut tidak akan mengubah apa pun dari objek yang dipanggil. Jadi kompiler tidak peduli apakah Anda memanggil fungsi konstan pada objek konstan atau non-konstan karena fungsi itu sendiri tidak dapat mengubah objek.
person hafiz031    schedule 11.07.2019