繁体   English   中英

在 const 对象上调用非常量函数

[英]Call non-const function on a const object

我正在阅读 C++ Primer 第 5 版第 258 页。问题是,const 对象是否可以调用其非常量成员函数,即使该成员函数不修改其数据?

销售数据.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);
}

当我删除函数avg_priceconst ,代码不会编译。 但我认为函数avg_price()不会修改对象。 我的猜测是,在print的参数列表中,我将Sales_data对象声明为const并且 C++ 不允许 const 对象调用其非常量成员函数。 是这种情况吗?

是的。 记住两件事——

  1. 如果函数是非常量的,则只能由非常量对象调用。
  2. 如果函数是常量,则可以在任何对象上调用它(我的意思是任何常量或非常量对象。)

原因:

  1. 如果函数是非常量的,则允许该函数更改正在调用它的对象的值。 因此编译器不允许创建这种机会并阻止您在常量对象上调用非常量函数,因为常量对象意味着您不能再更改它的任何内容。 所以编译器只允许你在非常量对象上调用它,因为这个对象可以被修改。
  2. 如果函数本身是常量,那么它不会改变调用它的对象的任何内容。 因此编译器并不关心您是在常量对象还是非常量对象上调用常量函数,因为函数本身无法更改对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM