- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试通过相同的方法重载运算符“=”和运算符“<<”。
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);
,它告诉编译器该函数是周围类的友元,但不是其成员。作为非成员,它操作的两个参数是 out
和 vect
- 没有 *this
涉及的对象。一切正常,并且是一个friend
该定义还可以访问 vect
中的私有(private)和 protected 成员数据.
移动operator<<
class Vect
以外的申报定义;这也使它成为非成员函数,但不会使其成为友元。
关于c++ - 为什么一定要用友元功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33749145/
我正在尝试开发右边框/Angular 具有特定 Angular (30°) 的表格。我见过一些类似的解决方案,但它们都无法在一定程度上发挥作用。如果我想从 30° 改变到 20°,我不想花太多力气。
我是一名优秀的程序员,十分优秀!