zoukankan      html  css  js  c++  java
  • 为什么const对象只能调用const成员函数,而不能调用非const成员函数?

    在c++中,我们可以用const来定义一个const对象,const对象是不可以调用类中的非const成员函数,这是为什么呢?下面是我总结的一些原理。

    假设有一个类,名字为test代码如下:

    1 class test{
    2   int i;
    3 public:
    4   void print();
    5   test(int i);
    6 };

    我们知道c++在类的成员函数中还会隐式传入一个指向当前对象的this指针,所以在test类中,实际的print函数应该是这样的void print(test * this);,这代表一个指向test对象的指针this被传入到了print函数中

    假如现在我们用test类创建一个对象,

    1 test obj1(12);
    2 obj1.print();

    第二句,obj1.print();其实相当于print(&obj1);,即把当前的对象obj1的指针传递到print()函数,这是没问题的

    如果用test类创建一个const对象,然后去调用print()函数呢?这就会出现问题

    const test obj2(122);
    obj2.print();

    这时obj2对象的指针就会传递给test *this 指针,而obj2的地址翻译成指针类型应该是这样的,const test* this,即这时会出现类型不匹配的错误,在visual studio 中会出现类似于下面的错误:

    4

    所以通过上面的说明,我们知道了为什么const 对象不能调用非const成员函数。

    下面解释为什么const 对象可以调用const成员函数,

    1 class test{
    2 public:
    3      void print()const;
    4 };

    前面我们把非const成员函数print(),翻译了一下,同样const成员函数也要翻译,void print()const; 可以翻译成 void print(const test* this);,那么常量对象的地址翻译是const test* this; 是和void print() const;中this指针的类型是一样的,所以常量对象可以调用const成员函数。

    有一个点要注意,在c++中其实是有最小权限原则的,非const对象是可以调用const成员函数的

  • 相关阅读:
    Alpha 冲刺 (4/10)
    福大软工1816 · 团队现场编程实战(抽奖系统)
    Alpha 冲刺 (3/10)
    Alpha 冲刺 (2/10)
    Alpha 冲刺 (1/10)
    福大软工 · 第七次作业
    福大软工 · 第八次作业(课堂实战)- 项目UML设计(团队)
    福大软工1816 · 第六次作业
    福大软工1816 · 第五次作业
    福大软工1816 · 第四次作业
  • 原文地址:https://www.cnblogs.com/cplinux/p/5553716.html
Copyright © 2011-2022 走看看