c++重载<<操作符和友缘问题。
这是一个对"<<"操作符进行重载,使其可以输出自定义的类中的元素的简单代码。 这段代码我有俩问题:#include <iostream>
#include <string>
using namespace std;
class dio
{
public:
dio(int a,int b)
{
real=a,imag=b;
}
friend ostream &operator<<(ostream &os,dio i); //第一个问题在这,在这里我已经声明了友缘,但是还是报错说没权限访问private里面的元素。把dio类的“private:”去掉之后运行没问题。
private:
int real;
int imag;
};
ostream &operator<<(ostream &os,dio i) //第二个问题在这,这里为什么要加两个取地址符“&”呢?
{
os<<i.real<<','<<i.imag<<endl;
return os;
}
int main()
{
dio jojo(1,3);
cout<<jojo;
return 0;
}
这是vc6的报错信息:
E:\C语言练习\liani73\73.cpp(20) : error C2248: 'real' : cannot access protected member declared in class 'dio'
E:\C语言练习\liani73\73.cpp(15) : see declaration of 'real'
E:\C语言练习\liani73\73.cpp(20) : error C2248: 'imag' : cannot access protected member declared in class 'dio'
E:\C语言练习\liani73\73.cpp(16) : see declaration of 'imag'
E:\C语言练习\liani73\73.cpp(27) : error C2593: 'operator <<' is ambiguous
执行 cl.exe 时出错.
1 我也是在VC6.0测试的,估计与编译器有关,新版编译器可能不会出现这种问题(试验后反馈下哈)。
第一个问题很奇怪,但当我把这个函数体放进类里边的时候,一切都好了。
#include <iostream>
#include <string>
using namespace std;
class dio
{
public:
dio(int a,int b)
{
real=a,imag=b;
}
friend ostream &operator<<(ostream &os,dio i)
{
os <<i.real<<','<<i.imag<<endl;
return os;
}
private:
int real;
int imag;
};
int main()
{
dio jojo(1,3);
cout<<jojo;
return 0;
}
2 在C++ 中 & 符号,不是取地址符, 而是叫做引用,可以理解为一个别名,
所以他这个函数返回一个ostream的引用就可以连续的使用 << 这个符号作为输出了,
反之不返回引用,就不能在一个cout里重复使用<<。 本帖最后由 Krant5 于 2019-7-3 15:55 编辑
第二问: 那种情况下,叫做对象引用,而不是什么取地址, 主要是为了方便链式编程 比如cout <<1 <<2<<3
第一问的话太久没用C++了,记不清了,建议查查语法
另外,我用你的代码访问没有任何问题没报错误
newu 发表于 2019-7-3 15:41
1 我也是在VC6.0测试的,估计与编译器有关,新版编译器可能不会出现这种问题(试验后反馈下哈)。
第一个 ...
恩恩,谢谢大佬,我百度了一下,说是这个报错是因为VC6.0在重载<<时,如果用 using namespace std ;的话,会报错这是VC6.0的bug Krant5 发表于 2019-7-3 15:43
第二问: 那种情况下,叫做对象引用,而不是什么取地址, 主要是为了方便链式编程 比如cout
恩恩,谢谢大佬,我百度了一下,说是这个报错是因为VC6.0在重载<<时,如果用 using namespace std ;的话,会报错这是VC6.0的bug 有风轻语 发表于 2019-7-6 13:07
恩恩,谢谢大佬,我百度了一下,说是这个报错是因为VC6.0在重载
好的
页:
[1]