在 const 对象上调用非常量函数
Call non-const function on a const object
我正在阅读 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_price
的 const
时,代码无法编译。但是我认为函数 avg_price()
并没有修改对象。我的猜测是,在 print
的参数列表中,我将 Sales_data
对象声明为 const
并且 C++ 不允许 const 对象调用其非 const 成员函数。是这样吗?
是的。记住两件事-
- 如果函数是non-constant,它只能被a调用
non-constant 对象。
- 如果函数是常量,它可以在任何对象上调用(我的意思是
任何常量或 non-constant 个对象。)
原因:
- 如果函数是non-constant,那么允许函数
更改调用它的对象的值。所以
编译器不允许创造这种机会并阻止您调用
常量对象上的 non-constant 函数,作为常量对象
意味着你不能再改变它的任何东西了。所以编译器只
允许您在 non-constant 对象上调用它,因为该对象可以
已修改。
- 如果函数本身是常量,那么它很有希望
不会改变调用它的对象的任何内容。所以
编译器不关心你是否调用常量
在常量或 non-constant 对象上的函数作为函数本身
无法更改对象。
我正在阅读 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_price
的 const
时,代码无法编译。但是我认为函数 avg_price()
并没有修改对象。我的猜测是,在 print
的参数列表中,我将 Sales_data
对象声明为 const
并且 C++ 不允许 const 对象调用其非 const 成员函数。是这样吗?
是的。记住两件事-
- 如果函数是non-constant,它只能被a调用 non-constant 对象。
- 如果函数是常量,它可以在任何对象上调用(我的意思是 任何常量或 non-constant 个对象。)
原因:
- 如果函数是non-constant,那么允许函数 更改调用它的对象的值。所以 编译器不允许创造这种机会并阻止您调用 常量对象上的 non-constant 函数,作为常量对象 意味着你不能再改变它的任何东西了。所以编译器只 允许您在 non-constant 对象上调用它,因为该对象可以 已修改。
- 如果函数本身是常量,那么它很有希望 不会改变调用它的对象的任何内容。所以 编译器不关心你是否调用常量 在常量或 non-constant 对象上的函数作为函数本身 无法更改对象。