เรียกใช้ฟังก์ชัน non-const บนวัตถุ const

ฉันกำลังอ่าน C++ Primer รุ่นที่ 5 หน้า 258 คำถามคือ const object สามารถเรียกฟังก์ชันที่ไม่ใช่ 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 เรียกใช้ฟังก์ชันสมาชิกที่ไม่ใช่ const เป็นกรณีนี้หรือไม่?


person yyFred    schedule 11.07.2019    source แหล่งที่มา


คำตอบ (1)


ใช่ จำสองสิ่ง-

  1. ถ้าฟังก์ชันไม่คงที่ จะสามารถเรียกได้โดยวัตถุที่ไม่คงที่เท่านั้น
  2. หากฟังก์ชันมีค่าคงที่ ก็สามารถเรียกใช้บนวัตถุใดก็ได้ (ฉันหมายถึงวัตถุคงที่หรือไม่คงที่)

เหตุผล:

  1. หากฟังก์ชันไม่คงที่ ฟังก์ชันจะได้รับอนุญาตให้เปลี่ยนค่าของออบเจ็กต์ที่กำลังเรียกใช้อยู่ ดังนั้นคอมไพเลอร์จึงไม่อนุญาตให้สร้างโอกาสนี้และป้องกันไม่ให้คุณเรียกใช้ฟังก์ชันที่ไม่คงที่บนวัตถุคงที่ เนื่องจากวัตถุคงที่หมายความว่าคุณไม่สามารถเปลี่ยนแปลงสิ่งใดได้อีกต่อไป ดังนั้นคอมไพเลอร์จึงอนุญาตให้คุณเรียกมันบนวัตถุที่ไม่คงที่เท่านั้นเนื่องจากวัตถุนี้สามารถแก้ไขได้
  2. หากฟังก์ชันมีค่าคงที่ แสดงว่าฟังก์ชันนี้จะไม่เปลี่ยนแปลงวัตถุที่ถูกเรียกใช้ ดังนั้นคอมไพลเลอร์ไม่สนใจว่าคุณกำลังเรียกใช้ฟังก์ชันคงที่บนวัตถุคงที่หรือไม่คงที่เนื่องจากฟังก์ชันนั้นไม่สามารถเปลี่ยนวัตถุได้
person hafiz031    schedule 11.07.2019