为啥 const 函数可以使用静态成员对象的非常量函数?

Posted

技术标签:

【中文标题】为啥 const 函数可以使用静态成员对象的非常量函数?【英文标题】:Why const function can use a static member object's non-const function?为什么 const 函数可以使用静态成员对象的非常量函数? 【发布时间】:2020-12-23 03:49:12 【问题描述】:

代码1:

#include <iostream>
using namespace std;

class Test1 
public:
  Test1()  num_ = 10; 
  int GetNum()  return num_; 

private:
  int num_;
;

class Test2 
public:
  int GetNum() const  return t1_.GetNum(); 

private:
  static Test1 t1_;
;

Test1 Test2::t1_;

int main(int argc, char *argv[]) 
  Test2 t2;
  cout << t2.GetNum() << endl;

代码2:

#include <iostream>
using namespace std;

class Test1 
public:
  Test1()  num_ = 10; 
  int GetNum()  return num_; 

private:
  int num_;
;

class Test2 
public:
  int GetNum() const  return t1_.GetNum(); 

private:
  Test1 t1_;
;

int main(int argc, char *argv[]) 
  Test2 t2;
  cout << t2.GetNum() << endl;

两个代码的区别在于code1的t1_是静态的。 Code1 有效。但是 Code2 报错:

错误:将“const Test1”作为“int Test1::GetNum()”的“this”参数传递会丢弃限定符 [-fpermissive] int GetNum() const return t1_.GetNum();

为什么 Code1 可以工作?

【问题讨论】:

【参考方案1】:

作为非静态数据成员,t1_ 在 const 成员函数中相应地变为 const。然后t1_.GetNum() 导致错误,因为无法在 const 对象上调用非常量成员函数。

另一方面,静态数据成员不属于对象;它不会因为在 const 成员函数中而成为 const。

【讨论】:

以上是关于为啥 const 函数可以使用静态成员对象的非常量函数?的主要内容,如果未能解决你的问题,请参考以下文章

测试页面

如何在 const 成员函数中使用非常量成员函数?

虚函数后面的const=0

C++面向对象-static、const

在非常量对象上,为啥 C++ 不调用具有 public-const 和 private-nonconst 重载的方法的 const 版本?

class中static总结-静态成员函数和静态成员变量