gpt4 book ai didi

c++ - 为什么一定要用友元功能

转载 作者:行者123 更新时间:2023-11-30 01:12:38 24 4
gpt4 key购买 nike

我正在尝试通过相同的方法重载运算符“=”和运算符“<<”。

class Vect{
public:
//..
Vect& operator=(const Vect& a);
ostream& operator<<(ostream& out, const Vect& vect);
//..
private:
int *data;
int size;
};

这项工作

Vect& Vect:: operator=(const Vect& a){
//..
//copy data operator
for(int i = 0; i< size; i++){
data[i] = a.data[i];
}
return *this;
}

但是:这段代码会导致错误
[错误] 'std::ostream& Vect::operator<<(std::ostream&, const Vect&)' 必须只接受一个参数

ostream& Vect::operator<<(ostream& out, const Vect& vect){
//.. print vect
}

我正在阅读“C++ 中的数据结构和算法”一书部分 (1.5.4)。他们说我必须使用 class friends 来重载 '<<' 运算符,因为它是访问私有(private)成员数据。 我不明白为什么。重载“=”运算符我也可以在不使用“ friend ”的情况下访问私有(private)成员数据。

最佳答案

当你在类定义中放置一个函数声明时,它默认成为一个成员函数,所以...

class Vect {
public:
ostream& operator<<(ostream& out, const Vect& vect);
};

...不会编译,因为它要求创建 <<参数太多的函数:任何成员函数 operator<<预计使用*this作为“左手边”论点,并将另一个论点作为“右手边”。

你有两个选择:

  • 将上面的替换为friend ostream& operator<<(ostream& out, const Vect& vect); ,它告诉编译器该函数是周围类的友元,但不是其成员。作为非成员,它操作的两个参数是 outvect - 没有 *this涉及的对象。一切正常,并且是一个friend该定义还可以访问 vect 中的私有(private)和 protected 成员数据.

  • 移动operator<< class Vect以外的申报定义;这也使它成为非成员函数,但不会使其成为友元。

关于c++ - 为什么一定要用友元功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33749145/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com