【问题标题】:how cout can call the private members of a classcout 如何调用类的私有成员
【发布时间】:2017-01-01 10:44:08
【问题描述】:

我正在试验朋友功能并写了以下内容:

#include <iostream>

using namespace std;

class Comp {
private:
  double r,i;
public:
  Comp(){
    r = 10.5;
    i = 25.1;
  }
  friend ostream& operator <<(ostream& write, Comp & comp);
};

ostream& operator << (ostream& write, Comp& comp){
  write << comp.r << ":  " << comp.i;
  return write;
}

int main(int argc, char const *argv[]) {
  /* code */
  Comp comp;
  cout << comp;      
  return 0;
}

所以出现了一个问题(因为我不是 c++ 专家,刚开始学习 c++)为什么 cout 可以访问 Comp 类的私有成员。因为 cout 没有在类中声明,它也不是类的朋友。那么什么机制允许通过 ostream 类的对象 cout 访问类的私有成员。

基本上我想问的是其他类的对象(ostream 类 cout 的对象)如何在不成为类的朋友或成员的情况下访问其他类 Comp 的私有变量。 谢谢。

【问题讨论】:

  • cout &lt;&lt; comp; 将您的重载operator &lt;&lt; 称为Comp。由于该函数是Compfriend,它可以访问私有成员。尝试在课堂上注释掉friend 行,看看会发生什么。

标签: c++ oop g++


【解决方案1】:

cout 不访问任何内容。

cout << comp; 

等价于

operator<< (cout, comp);

并且您已将该重载运算符定义为友元,因此它可以访问私有成员。

(重载的运算符只是具有特殊名称的函数。)

【讨论】:

    【解决方案2】:

    cppreference

    您正在声明一个非成员函数。同时,您正在使该函数成为 Comp 类的朋友,因此它可以访问其私有成员。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多