永发信息网

C++中类的成员访问属性问题

答案:5  悬赏:40  手机版
解决时间 2021-04-13 16:41
  • 提问者网友:你独家记忆
  • 2021-04-12 18:23

教材有这么段代码,是定义重载运算符的,我对这段代码的粗体(我标出来的)有些疑问,请看代码:


#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里调试,也是不能通过,提示如下:

望解答,谢谢!

最佳答案
  • 五星知识达人网友:千杯敬自由
  • 2021-04-12 19:28

私有成员在外边当然不能访问了!


你可以设置公有接口来访问:


char* String::GetString()


{


return p;


}

全部回答
  • 1楼网友:孤老序
  • 2021-04-12 21:15

程序没有问题! 有问题也是编译器的原因!!!

问题一:p在类中已经定义为了私有变量,怎么能够通过对象名(str1.p)来引用它呢?

因为friend bool operator >(String &str1,String &str2);//声明运算符函数为友元函数

注意:私有变量可以被该类的成员函数以及友元函数访问!!!! 所以这里当然可以通过对象名访问!

问题二:我把这段代码在VC6.0里调试,也是不能通过....

这是VC6的一个BUG. 你把#include<iostream> 换成#include<iostream.h>即可.

也可以去下个SP6补丁安装. 望采纳!

  • 2楼网友:玩家
  • 2021-04-12 20:45
私有成员 不能直接在外部调用 必须在公有用函数接口来访问 6784746
  • 3楼网友:woshuo
  • 2021-04-12 19:57

1. 因为友元函数可以操作类的私有数据成员; 2. 可能是VC6的一个BUG,在Borland的C/C++编译器中是正常的,因为这个用法在C/C++规范中是合法的。

  • 4楼网友:渡鹤影
  • 2021-04-12 19:49

确实是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; }

我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯