读书人

C++ 基础标题 分析输出结果

发布时间: 2013-11-13 14:04:18 作者: rapoo

C++ 基础题目 分析输出结果
#include <iostream>
using namespace std;
class A{
private :
friend class B;
A(int val=0):data(val),use(1){}
int use,data;
};

class B{
public :
A *pa;
B(int val=0):pa(new A(val)){}
~B(){if(--pa->use==0)delete pa;}
B(B &rhs){
++rhs->use;
pa=rhs.pa;
}
B &operator=(B &rhs);
A *operator->(){return pa;}
void Display(){
cout<<"data="<<data<<",use="<<use<<endl; //为什么这里错误
}
};

B&B::operator=(B&rhs){
if(this==&rhs)return *this;
if(--pa->use==0)delete pa;
++rhs->use;
pa=rhs.pa;
return *this;
}

int main(){
B b1(1),b2(b1),b3(3);
b1.Display();
b2.Display();
b3.Display();
b3=b1;
b1.Display();
b3.Display();
return 0;
}



题目是说分析输出结果,但是这个有个错误
B类里面的 Display() 方法里面的 cout<<"data="<<data<<",use="<<use<<endl; 中有错误
说data , use 没有定义。
照理来说A类里已经有friend 了可以直接访问A的, 那些就是A的
求大神,什么原因,顺便说下输出结果是什么 C++ 基础 语法
[解决办法]
if(--pa->use==0)delete pa;
++rhs->use;
pa=rhs.pa;

你的Use有初始化吗,你看这里,显然没有
[解决办法]
那个data和use是A类的私有成员。。。B类不能直接访问。。
[解决办法]
话说A *operator->()这种操作符的重载很是不友好呢
(1)lz对C++友元的概念还是不清晰呢,建议lz去查些资料,友元可以访问朋友对象的任何域,但也不是说不用对象的指针或应用就直接在友元内部访问的,所以
cout<<"data="<<data<<",use="<<use<<endl;是不行的
但cout<<"data="<<pa->data<<",use="<<pa->use<<endl;是合法的(如果B不是A的友元,这个也不合法)
(2)对于main中代码的解释:
B b1(1),b2(b1),b3(3);之后b1和b2有一个相同的A对象的指针,且这个A对象的data = 1,use = 2,b3有一个A对象的指针,且这个A对象的data = 3,use = 1
b1.Display();
b2.Display();
b3.Display();
所以上述3行代码应该打印如下内容:
data=3,use=2
data=3,use=2
data=1,use=1
b3=b1;执行之后b3中A对象的指针变为b1中A对象的指针,且此时这个A对象的data = 3,use = 3
b1.Display();
b3.Display();
所以上述2行代码应该打印如下内容:
data=3,use=3
data=3,use=3

[解决办法]
楼主对友元了解的太少了,最好再去好好了解下。这里的设计太烂,按照楼主的意思,用继承会比友元更好一点。

B类是A类的友元,但不代表B类能直接访问A类的数据。某个类的友元只是让一个类或者方法访问该类的私有成员,但需要注意的是,必须有该类的指针或者对象,通过这些才能去访问该类的私有成员。但是楼主的作法是直接跨过对象、指针,直接访问了另一个类的东西,这是不可能的,B根本不了解A,他不知道谁是他的友元(A虽然知道,但B不知道)。

举个例子,就好比我把你当朋友,我有食物的你自己随便拿吃,我不会怪你,但是我从来没跟你说过这件事,那么你会不会随便拿别人的东西吃?你是否会觉得没有我的允许,随便拿别人的东西是不对的行为呢?但是有一天我在你旁边(相当于一个指针或者对象媒介),然后把食物(私有成员)分给了你,这个时候你就可以拿的理所应当了,因为我许可你。

如果是继承就不同了。比如A继承B,就好比我从我爸那里拿来了我爸的物品,我爸有什么,我都会有,这个和友元就不同了,不需要所谓许可。不过继承也分为private、public、protected继承,不同的继承,也会产生访问权限的问题,最好去了解下。

读书人网 >C++

热点推荐