【问题标题】:Call non-const function on a const object在 const 对象上调用非常量函数
【发布时间】:2019-11-20 16:10:33
【问题描述】:

我正在阅读 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);
}

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

【问题讨论】:

    标签: c++ c++11 constants member-functions const-correctness


    【解决方案1】:

    是的。记住两件事-

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

    原因:

    1. 如果函数是非常量的,则允许该函数 更改正在调用它的对象的值。所以 编译器不允许创造这个机会并阻止你调用 常量对象上的非常量函数,作为常量对象 意味着你不能再改变它的任何东西了。所以编译器只 允许您在非常量对象上调用它,因为该对象可以是 修改。
    2. 如果函数本身是常量,那么它很有希望 不会改变正在调用它的对象的任何内容。所以 编译器不在乎你是否在调用一个常量 函数在常量或非常量对象上作为函数本身 无法更改对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-29
      • 2018-08-14
      • 2019-07-09
      • 1970-01-01
      • 2018-06-25
      • 2011-06-27
      • 2019-04-21
      相关资源
      最近更新 更多