老师给我出的题`忘高手解说下`

时间:2021-11-20 12:06:11
  #include  <iostream.h> 
  #include  <math.h> 
  class A 

  private: 
          int x; 
  public: 
         A(){x=5;}; 
         friend class B; 

  class B 

  public: 
         void disp1(A tmp){tmp.x++;cout < <"disp1:x=" < <tmp.x < <end1;}; 
         void disp2(A tmp){tmp.x--;cout < <"disp2:x=" < <tmp.x < <end1;}; 

  void main() 

   A obj1; 
   B obj2; 
   obj2.disp1(obj1); 
   obj2.disp1(obj1); 

 忘各位高手给我详细解说解说`

14 个解决方案

#1


很简单的
随便找本C++的书上都有~~~

#2


运行下不就可以了?
楼主要解说什么?

另外,用int main()吧,好习惯从时刻做起。

#3



#include   <iostream.h>  
  #include   <math.h>  
  class A  
{  
  private:  
          int x;  
  public:  
         A(){x=5;};  
         friend class B;  
};  // 定义类后面要加分号,你忘记了。
  class B  
{  
  public:  
         void disp1(A tmp){tmp.x++;cout <<"disp1:x=" <<tmp.x <<endl;};  // 是endl 不是end1 
         void disp2(A tmp){tmp.x--;cout <<"disp2:x=" <<tmp.x <<endl;};  // end line 的意思。
};  // 定义类后面要加分号,你忘记了。

  int main()  // 养成好习惯。
{  
   A obj1;  
   B obj2;  
   obj2.disp1(obj1);  
   obj2.disp1(obj1);  
  return 0;
}

 一个程序最基本的要让他编译通过把。
  lz一定没有尝试着去编译。

#4


晕 。这样的字体L和1有点分不清。
 是endl(L) 不是end1(数字1)。 

另外老师什么意思? 改程序? 写程序?

还是想借用这个程序来理解 引用和值传递 的不同?

#5


因为我是个新手`所以希望各位高手帮我解说解说`顺便把结果告诉下我`

#6



#include   <iostream.h>  
  #include   <math.h>  
  class A  
{  
  private:  
          int x;  
  public:  
         A(){x=5;};  
         friend class B;    //声明B是A的友元类
}  
  class B  
{  
  public:  
         void disp1(A tmp){tmp.x++;cout  <  <"disp1:x="  <  <tmp.x  <  <end1;};  //B可以访问A的私有成员
         void disp2(A tmp){tmp.x--;cout  <  <"disp2:x="  <  <tmp.x  <  <end1;};  
}  
  void main()  
{  
   A obj1;  
   B obj2;  
   obj2.disp1(obj1);  
   obj2.disp1(obj1);  
}  
//没什么好解释的

#7


他只是想说明下友元的某些性质而已

#8


那得到的结果是什么哦?

#9


体现友元的作用吧
运行下不就知道了。。

#10


引用 8 楼 libo120120 的回复:
那得到的结果是什么哦?

vc++6.0下结果是:
disp1:x=6
disp1:x=6

#11


可能你老师想让你了解 引用和值传递 的不同,还有友元的访问权限

#12


老弟,你写的也太粗心了点。 
    1、类的最后缺2个";"。 
    2、" <  <"中间有空格。 
    3、"end1"是数字"1",应该是字符"l"。 

定义了类A,在构造函数中将私有变量赋值为5; 
定义了类B,为A类的友元类,可以访问A的私有变量;(一般其它类不能访问本类的私有变量) 
    B中有2个公共的方法,参数为类A的类型,输出一些信息。 

按: 
obj2.disp1(obj1);  
obj2.disp1(obj1);  
输出均为6,因为参数是属于值调用,disp1函数内的变化并不会传递给参数obj1本身。 

预计你写错一句,应给是: 
obj2.disp1(obj1);  
obj2.disp2(obj1);  
输出为6、4,理由同上。不然disp2函数白写了。 

在说明什么是友元之前,我们先说明一下为什么需要友元与友元的缺点:  

  通常对于普通函数来说,要访问类的保护成员是不可能的,如果想这么做那么必须把类的成员都生命成为public(共用的),然而这做带来的问题遍是任何外部函数都可以毫无约束的访问它操作它,c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作,避免把类成员全部设置成public,最大限度的保护数据成员的安全。  

  友元能够使得普通函数直接访问类的保护数据,避免了类成员函数的频繁调用,可以节约处理器开销,提高程序的效率,但矛盾的是,即使是最大限度的保护,同样也破坏了类的封装特性,这即是友元的缺点,在现在cpu速度越来越快的今天我们并不推荐使用它,但它作为c++一个必要的知识点,一个完整的组成部分,我们还是需要讨论一下的。  

  在类里声明一个普通函数,在前面加上friend修饰,那么这个函数就成了该类的友元,可以访问该类的一切成员。  

#13


关键是看后面调用两种的原因.

#14



class A 

private: 
int x; //私有整形变量 x
public: 
A(){ x=5;}; //构造函数
friend class B; //友元类,A中的所有成员能被B调用
}; //lz注意,这里要个" ; " 号

class B 

public: 
void disp1(A tmp){tmp.x++; cout <<"disp1:x=" <<tmp.x <<endl;}; //公有接口,将x++,然后显示
void disp2(A tmp){tmp.x--; cout <<"disp2:x=" <<tmp.x <<endl;};  //公有接口,将x--, 然后显示
}; 

void main() 

A obj1; //声明A类对象 obj1
B obj2; //声明B类对象 obj2
obj2.disp1(obj1); //调用B类接口,就是B的成员函数
obj2.disp1(obj1);

#1


很简单的
随便找本C++的书上都有~~~

#2


运行下不就可以了?
楼主要解说什么?

另外,用int main()吧,好习惯从时刻做起。

#3



#include   <iostream.h>  
  #include   <math.h>  
  class A  
{  
  private:  
          int x;  
  public:  
         A(){x=5;};  
         friend class B;  
};  // 定义类后面要加分号,你忘记了。
  class B  
{  
  public:  
         void disp1(A tmp){tmp.x++;cout <<"disp1:x=" <<tmp.x <<endl;};  // 是endl 不是end1 
         void disp2(A tmp){tmp.x--;cout <<"disp2:x=" <<tmp.x <<endl;};  // end line 的意思。
};  // 定义类后面要加分号,你忘记了。

  int main()  // 养成好习惯。
{  
   A obj1;  
   B obj2;  
   obj2.disp1(obj1);  
   obj2.disp1(obj1);  
  return 0;
}

 一个程序最基本的要让他编译通过把。
  lz一定没有尝试着去编译。

#4


晕 。这样的字体L和1有点分不清。
 是endl(L) 不是end1(数字1)。 

另外老师什么意思? 改程序? 写程序?

还是想借用这个程序来理解 引用和值传递 的不同?

#5


因为我是个新手`所以希望各位高手帮我解说解说`顺便把结果告诉下我`

#6



#include   <iostream.h>  
  #include   <math.h>  
  class A  
{  
  private:  
          int x;  
  public:  
         A(){x=5;};  
         friend class B;    //声明B是A的友元类
}  
  class B  
{  
  public:  
         void disp1(A tmp){tmp.x++;cout  <  <"disp1:x="  <  <tmp.x  <  <end1;};  //B可以访问A的私有成员
         void disp2(A tmp){tmp.x--;cout  <  <"disp2:x="  <  <tmp.x  <  <end1;};  
}  
  void main()  
{  
   A obj1;  
   B obj2;  
   obj2.disp1(obj1);  
   obj2.disp1(obj1);  
}  
//没什么好解释的

#7


他只是想说明下友元的某些性质而已

#8


那得到的结果是什么哦?

#9


体现友元的作用吧
运行下不就知道了。。

#10


引用 8 楼 libo120120 的回复:
那得到的结果是什么哦?

vc++6.0下结果是:
disp1:x=6
disp1:x=6

#11


可能你老师想让你了解 引用和值传递 的不同,还有友元的访问权限

#12


老弟,你写的也太粗心了点。 
    1、类的最后缺2个";"。 
    2、" <  <"中间有空格。 
    3、"end1"是数字"1",应该是字符"l"。 

定义了类A,在构造函数中将私有变量赋值为5; 
定义了类B,为A类的友元类,可以访问A的私有变量;(一般其它类不能访问本类的私有变量) 
    B中有2个公共的方法,参数为类A的类型,输出一些信息。 

按: 
obj2.disp1(obj1);  
obj2.disp1(obj1);  
输出均为6,因为参数是属于值调用,disp1函数内的变化并不会传递给参数obj1本身。 

预计你写错一句,应给是: 
obj2.disp1(obj1);  
obj2.disp2(obj1);  
输出为6、4,理由同上。不然disp2函数白写了。 

在说明什么是友元之前,我们先说明一下为什么需要友元与友元的缺点:  

  通常对于普通函数来说,要访问类的保护成员是不可能的,如果想这么做那么必须把类的成员都生命成为public(共用的),然而这做带来的问题遍是任何外部函数都可以毫无约束的访问它操作它,c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作,避免把类成员全部设置成public,最大限度的保护数据成员的安全。  

  友元能够使得普通函数直接访问类的保护数据,避免了类成员函数的频繁调用,可以节约处理器开销,提高程序的效率,但矛盾的是,即使是最大限度的保护,同样也破坏了类的封装特性,这即是友元的缺点,在现在cpu速度越来越快的今天我们并不推荐使用它,但它作为c++一个必要的知识点,一个完整的组成部分,我们还是需要讨论一下的。  

  在类里声明一个普通函数,在前面加上friend修饰,那么这个函数就成了该类的友元,可以访问该类的一切成员。  

#13


关键是看后面调用两种的原因.

#14



class A 

private: 
int x; //私有整形变量 x
public: 
A(){ x=5;}; //构造函数
friend class B; //友元类,A中的所有成员能被B调用
}; //lz注意,这里要个" ; " 号

class B 

public: 
void disp1(A tmp){tmp.x++; cout <<"disp1:x=" <<tmp.x <<endl;}; //公有接口,将x++,然后显示
void disp2(A tmp){tmp.x--; cout <<"disp2:x=" <<tmp.x <<endl;};  //公有接口,将x--, 然后显示
}; 

void main() 

A obj1; //声明A类对象 obj1
B obj2; //声明B类对象 obj2
obj2.disp1(obj1); //调用B类接口,就是B的成员函数
obj2.disp1(obj1);