C++之const对象只能调用const成员函数---补充(18)《More Effective C++》
2017-08-31 10:03
429 查看
C++中,const对象只能调用const成员函数,原因是什么呢?下面我们针对如下例子并对其进行分析进而理解其中缘由:
编译报错:
我们可以看到,编译器报错为无法将const MyInt转换为MyInt&,说明const对象调用非const成员函数的时候出现了一些转换问题,下面我们就来进行一下分析:
const对象无法调用非const成员函数:
void show()等价于void show(MyInt* this),非const对象那个mi2调用时即mi2.show(),即传递了一个非const对象那个指针即MyInt* this进入,因此show函数执行成功!
const对象呢?const MyInt mi3(10),现在等价于当前传递进去的参数类型是const MyInt*,此时将该指针传递给MyInt*存在一个转化失败问题,所以const成员对象不能调用非const成员对象。
const对象可以调用const成员函数:
const对象可以调用const成员函数,因为const成员函数默认参数为const MyInt* this,我们创建const对象,即传递进去的指针仍旧为const MyInt*,所以调用成功。
#include <iostream> #include <string> using namespace std; class MyInt{ private: int i; public: MyInt(){ } MyInt(int i) :i(i){ } MyInt& operator++(){ this->i += 1; return *this; } const MyInt operator++(int){ MyInt oldInt = MyInt(*this); this->i += 1; return oldInt; } void show(){ cout << i << endl; } }; int main(){ MyInt mi(10), mi2(100); mi2++.show(); return 0; }
编译报错:
我们可以看到,编译器报错为无法将const MyInt转换为MyInt&,说明const对象调用非const成员函数的时候出现了一些转换问题,下面我们就来进行一下分析:
const对象无法调用非const成员函数:
void show()等价于void show(MyInt* this),非const对象那个mi2调用时即mi2.show(),即传递了一个非const对象那个指针即MyInt* this进入,因此show函数执行成功!
const对象呢?const MyInt mi3(10),现在等价于当前传递进去的参数类型是const MyInt*,此时将该指针传递给MyInt*存在一个转化失败问题,所以const成员对象不能调用非const成员对象。
const对象可以调用const成员函数:
const对象可以调用const成员函数,因为const成员函数默认参数为const MyInt* this,我们创建const对象,即传递进去的指针仍旧为const MyInt*,所以调用成功。
相关文章推荐
- [C++] const对象只能调用const方法的原因
- C++中const引用的是对象的时候只能调用该对象的f()const方法
- 为什么const对象只能调用const成员函数,而不能调用非const成员函数?
- C++中const引用的是对象的时候只能调用该对象的f()const方法
- 为什么const对象只能调用const成员函数,而不能调用非const成员函数?
- C++细节学习之const对象只能调用const函数
- 项目中的错误:const对象只能调用const函数
- 为什么const对象只能访问const成员函数
- 《MORE EFFECTIVE C++》条款27 要求或者禁止对象分配在堆上
- More Effective C++ 条款18
- 常对象只能调用常函数成员 c++
- More Effective C++(条款18:分期摊还预期的计算成本)
- 《More Effective C++》学习心得(八) 要求(或禁止)对象产生于heap中
- More Effective C++(条款12:了解“抛出一个异常exception”与“传递一个参数”或“调用一个虚函数”之间的差异)
- More Effective C++(条款19:了解临时对象的来源)
- more effective c++(临时对象的返回值优化)
- 《More Effective C++》条款27:如何让类对象只在栈(堆)上分配空间?
- C++中理解“抛出一个异常”与“传递一个参数”或“调用一个虚函数”间的差异(11)---《More Effective C++》
- 《More Effective C++》条款27:如何让类对象只在栈(堆)上分配空间?
- [More Effective C++]条款十九:理解临时对象的来源