c++ 中的友元函数的普通用法

  C++中友元函数的调用,一般分为三种方式:

1、一般的友元函数

2、类A作为类B的友元类,则类A的成员函数都是类B的友元函数。

3、一个类的成员函数作为另外一个类的友元函数

//分为友元函数的例子

类A 作为测试的类,类B 是类A的友元类。
class A
{
public:
 A()
 {
  a = 100;
  b = 10;
 }
 friend class B; //这儿公私均可,常常用到的是变为私有变量,类B是类A的友元类。友元的第二种方式,需要带class
 int getA()
 {
  return a;
 }
 void printAB()
 {
  cout<<"a"<<a<<" b"<<b<<endl;
 }

friend void setA(A *p, int _a); //友元函数的定义,friend 放在前面,记得友元函数的是将friend 放在函数的前面 ,友元函数的第一种方式

protected:

private:

int a;

int b;

static int module;

};

int A::module = 10;
class B
{
public:
 void setA(A *p, int _a);
 void displayA(A *p)
 {
  cout<<p->a<<"ddddd"<<endl;
 }
protected:
 
private:
};
//友元类的类的成员函数都是友元函数 第二种方式
void B:: setA( A *p, int _a)
{
 p->a = _a + 100;
 p->b = _a + 100;
}

//普通的友元函数  第一种方式的具体实现

void setA(A *p, int _a)

{

  p->a = _a;

  p->b = _a;

 }

用类girl 和类boy来举例,既有boy 作为girl的友元类,又有boy的成员函数是girl的友元函数,这两种形式。

class girl;
class boy
{
public:
 void display_girl(girl &x); //普通成员的函数的定义没有改变
 //{
 // cout<<"girl-name"<<x.name<<"age"<<x.age<<endl;
 //}
};

class girl
{
public: //当初这个没有写pulic 导致出现错误
girl()
 {
  name = NULL;
  name = new char[10];
  if( NULL !=name)
  {
   strcpy(name,"fal");
  }
  age = 26;
 }

~girl()
 {
  if( NULL != name){
   //free(name);
   delete [] name;
  }
  
 }
private:
 char *name;
 int age;
 //friend class boy; //当初写代码的时候没有写class, 这是一个错误 ,友元的第二这种方式
 friend void  boy::display_girl(girl &x); //允许某一个类的成员函数访问  第3种方式
};

友元函数的具体实现过程:

void boy::display_girl(girl &x)
{
 cout<<"girl-name:"<<x.name<<"\t age:"<<x.age<<endl;
}

主函数,
int main(void)
{
 A testa;
 B testB;
 girl fal;
 boy zjl;
 zjl.display_girl(fal);
 testB.setA(&testa, 10);
 cout<<"aa"<<testa.getA()<<endl;
 setA(&testa, 6);
 cout<<"bb"<<testa.getA()<<endl;
 return 0;
}

备注:learnCpluseplus/FunctionAndReload/dm03_friendly.cpp

时间: 2024-11-03 20:23:25

c++ 中的友元函数的普通用法的相关文章

VHDL中的数据转换函数conv_std_logic_vector的用法

VHDL中的数据转换函数conv_std_logic_vector的用法 2017-04-10 11:58 501人阅读 评论(0) 收藏 举报  分类: 常用(13)  FPGA(7)  高压变频(36)  程序备忘(42)  std_logic_arith程序包里定义的数据转换函数:conv_std_logic_vector(A,位长)--INTEGER,SINGER,UNSIGNED转换成std_logic_vector. 由于参考书上都没有具体说明,本以为是将原来的数据类型按位矢量输出,

在复数类模板中使用友元函数实现复数相加

程序代码(这段代码在vc6.0中不能编译通过,在VS中能编译通过) <span style="font-size:18px;">#include <iostream> using namespace std; template<class T>//类声明前加模板的声明 class Complex { public: Complex( ) { real=0; imag=0; } Complex(T r,T i) { real=r; imag=i; }

C++中的友元函数和友元类

#include <iostream> using namespace std; class myClass1 { public : myClass1():n(0){}; void setn(int tmpn){this->n=tmpn;} void show(){cout<<n<<endl;} private: //友元类 friend class myClass2; //使用友元函数来改变myclass1中成员变量n的值 friend void setnF1(

Js中call apply函数以及this用法

this介绍: C#里this关键字的意义比较确定的.JavaScript的this关键字,随着函数使用场合不同,this的值会发生变化,感觉用法比较混乱,所以,现在是有必要整理一下的时刻了! 总结一个原则:在js里面,this指针代表的是执行当前代码的对象的所有者. 1.和c#类似的纯粹函数调用: function test() { this.x = 1; alert(x); } test();//1 其实这里的this就是全局变量.看下面的例子就能很好的理解这里的this就是全局对象Glob

mysql中时间计算函数SQL DATE_SUB()用法

本文为博主原创,未经允许不得转载: 在写sql的时候,经常要在sql中传值时间,对时间进行计算并过滤.之前都是将时间在后台计算好,直接传值给sql, 今天发现,有一个更方便的sql函数,可以简化很多代码.这个函数就是 DATE_SUB(). DATE_SUB 将从一个日期/时间值中减去一个时间值(时间间隔). 其函数中用法表达式为:DATE_SUB(date,INTERVAL expr type), type的参数可以为一下类型: MICROSECOND SECOND MINUTE HOUR D

linux中的fork函数的基本用法

代码: 1 #include <iostream> 2 #include <string> 3 #include <cstdio> 4 #include <unistd.h> 5 #include <sys/wait.h> 6 7 using namespace std; 8 9 int main(int argc,char* argv[]){ 10 11 pid_t pid; 12 for(int i = 0; i < 1; i++){

模板类中的友元函数

friend ostream& operator<< <T>(ostream &out, Complex &c); template <typename T> ostream& operator<<(ostream &out, Complex<T> &c) {     out << c.a << " " << c.b << endl

C++:友元(非成员友元函数、成员友元函数、友元类)

3.8  友元:友元函数和友元类 友元函数 :既可以是不属于任何类的非成员函数,也可以是另一个类的成员函数,统称为友元函数.友元函数不是当前类的成员函数,而是独立于类的外部函数,但它可以访问该类所有的成员,包括私有成员.保护成员和公有成员.在类中声明友元函数时,需在其函数名前加上关键字friend,此声明可以放在公有部分.也可以放在保护和私有部分.友元函数可以定义在类部,也可以定义在类的外部. 3.8.1 将非成员函数声明为友元函数 //1.将非成员函数声明为友元函数 // 例3.33 友元函数

类模板友元函数坑死人不偿命的错误

错误例程: #include<iostream> using namespace std; template<class T> class Student { private: T age; public: Student(T age_) :age(age_){} friend bool operator==(const Student<T>& s1, const Student<T>& s2); }; int main() { Studen