教材有这么段代码,是定义重载运算符的,我对这段代码的粗体(我标出来的)有些疑问,请看代码:
#include<iostream>
#include<string>
using namespace std;
//定义一个string类
class String
{public:
String()//初始化对象数据成员
{p=NULL;}
String(char *str);//重载构造函数
friend bool operator >(String &str1,String &str2);//声明运算符函数为友元函数
void display();
private:
char *p;
};
String::String(char *str)//定义构造函数
{
p=str;//使P指向实参字符串
}
void String::display()
{cout<<p;}//输出P所指向的字符串
bool operator >(String &str1,String &str2)//定义运算符重载函数
{
if(strcmp(str1.p,str2.p))
return true;
else return false;
}
int main()//编写测试函数
{String str1("Hello"),str2("Book");
cout<<(str1>str2)<<endl;
return 0;
}
p在类中已经定义为了私有变量,怎么能够通过对象名(str1.p)来引用它呢?我把这段代码在VC6.0里调试,也是不能通过,提示如下:
望解答,谢谢!
私有成员在外边当然不能访问了!
你可以设置公有接口来访问:
char* String::GetString()
{
return p;
}
程序没有问题! 有问题也是编译器的原因!!!
问题一:p在类中已经定义为了私有变量,怎么能够通过对象名(str1.p)来引用它呢?
因为friend bool operator >(String &str1,String &str2);//声明运算符函数为友元函数
注意:私有变量可以被该类的成员函数以及友元函数访问!!!! 所以这里当然可以通过对象名访问!
问题二:我把这段代码在VC6.0里调试,也是不能通过....
这是VC6的一个BUG. 你把#include<iostream> 换成#include<iostream.h>即可.
也可以去下个SP6补丁安装.
望采纳!
1. 因为友元函数可以操作类的私有数据成员;
2. 可能是VC6的一个BUG,在Borland的C/C++编译器中是正常的,因为这个用法在C/C++规范中是合法的。
确实是vc6里面的bug,vc2003里没有问题。改成下面的形式在vc6里面可以通过,可见是friend声明时编译器找不准函数类型了。
#include<iostream>
#include<string>
using namespace std;
//定义一个string类
class String
{public:
String()//初始化对象数据成员
{p=NULL;}
String(char *str);//重载构造函数
void display();
public:
char *p;
};
String::String(char *str)//定义构造函数
{
p=str;//使P指向实参字符串
}
void String::display()
{cout<<p;}//输出P所指向的字符串
bool operator >(String &str1,String &str2)//定义运算符重载函数
{
if(strcmp(str1.p,str2.p))
return true;
else return false;
}
int main()//编写测试函数
{String str1("Hello"),str2("Book");
cout<<(str1>str2)<<endl;
return 0;
}
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息