友元



1友元:C++控制类对象私有部分的访问,但有时候需要在类的外部访问类的私有成员,这种情况下C++提供了友元机制。

 
创建友元函数步骤:

 
A:将函数声明放到类的声明中,并在原型前加上关键字friend

friend
返回值
函数名称(参数列表);

friend classclassname;

 
B:编写友元函数定义,不需要再定义中使用关键字friend.

   friend int
友元函数名(const classname &a);

#include
<iostream>

 

using
namespace
std;

 

class
demo

{

private:

   
int
i;//只能在类的内部访问

public:

   
demo()
//构造函数

   
{

       cout
<< "demo"
<< this
<< endl;

   
}

   
demo(const
demo
&it)
//拷贝构造

   
{

       //一旦自己实现了拷贝构造函数,类成员之间的赋值就需要自己完成,编译器不管了

       this->i
=
it.i;

       cout
<< "copy
demo" <<
this <<
endl;

   
}

   
~demo()

   
{

       cout
<< "~demo"
<< this
<< endl;

   
}

   
void
set_i(int
i)

   
{

       this->i
=
i;

   
}

   
int
get_i()

   
{

       return
i;

   
}

   
//意思是声明一个该类的友元函数,该函数可以调用本类的信息

   
friend
void
test();

   
//意思是声明一个该类的友元,该类的信息可以被下面的类调用

   
friend
class
demo1;

   
//demo和demo0互为友元

   
friend
class
demo0;

};

 

void
test()

{

   
//因为这个函数时上面的

   
demo
d;

   
//这里d.i就是demo中的私有的变量,由于使用了友元,所以test可以使用了

   
d.i
=
100;

   
printf("%d\n",d.i);

}

 

class
demo0

{

private:

   
int
i;

public:

   
demo0()

   
{

       demo
d;

       d.i
=
123;

       //打印出了123,说明友元中的类可以访问类中变量

       printf("%d\n",d.i);

   
}

};

 

class
demo1

{

public:

   
demo1()

   
{

       demo
d;

       d.i
=
144;

       printf("%d\n",d.i);

   
}

   
friend
class
demo2;

};

 

//通过下面的例子得出:我的朋友的朋友,不会是我的朋友

class
demo2

{

public:

   
demo2()

   
{

       demo
d;

       //这一句不能放开,如果放开了报错

       //d.i
=
155;

   
}

};

 

int
main(void)

{

   
test();

 

   
demo0
d0;

 

   
demo1
d1;

 

   
//下面运行的时候报错了,说明友元的一个特点:我的朋友的朋友,不会是我的朋友

   
//demo2
d2;

 

   
return
0;

}

2.运行截图:

3.友元关系说明图

 

时间: 2024-10-29 23:44:46

友元的相关文章

c++ 重载操作符友元问题

问题描述 c++ 重载操作符友元问题 <c++ primer>里面有一段文字: Salesitem 类也是说明为何有些操作符需要设置为友元的一个好例子.它定义了一个成员操作符,并且有三个非成员操作符.这些非成员操作符需要访问私有数据成员,声明为友元: class Sales_item {friend std::istream& operator>>(std::istream& Sales_item&);friend std::ostream& ope

C++友元

类的提前声明 回忆函数的原型声明 #include <iostream> using std::cout; using std::endl; void test(); int main() { test(); return 0; } void test() { cout << "函数的提前声明!" << endl; } 类和函数也是类似的,有时也需要提前声明 class B; //提前声明 class A { //class B }; int mai

C++中类模板(class template)友元(friend) 的全部六种形式

类模板(class template)的友元(friend)和普通类的友元, 有很多区别, 主要原因是类模板包含模板参数(template parameter), 就会导致友元和类模板有很多匹配形式; 主要包含六种形式: 1. 类 - 友元(friend): "模板参数是当前类"的类模板; 2. 类 - 友元: "模板参数任意"的模板类; 3. 模板类 - 友元: "模板参数相同"的模板类; 4. 模板类 - 友元: "模板参数任意&q

C++:模板函数需要类型转换时使用友元(friend)模板函数

模板函数的隐式(implicit)类型转换, 涉及到模板参数(typename)的确定问题. 从int或double类型, 无法隐式转换为模板类(template class)的类型, 因为无法确定模板参数类型(typename), 就无法确定构造函数的参数. 所以需要使模板函数, 与模板类拥有相同的参数类型(typename), 则需要成为模板类的友元(friend). 模板类的友元, 会随着类的参数实例化, 而实例化参数类型, 从一个函数模板, 生成定制的函数, 即可以通过隐式类型转换. 因

C++学习摘要之六:友元函数与友元类

采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为 公有的,依此提供类与外界间的通信接口.但是,有时需要定义一些函数,这些函数不是类的一部分,但 又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数.除了友元函数外,还有 友元类,两者统称为友元.友元的作用是提供了工序的运行效率,但又破坏了类的封装性. 1.友元函数 友元函数是可以直接访问类的私有成员的非成员函数.它是定义在类外的普通函数,它不属于任何类 ,但需要在类的定义中加以声明,声明时

C++友元入门教程

在说明什么是友元之前,我们先说明一下为什么需要友元与友元的缺点: 通常对于普通函数来说,要访问类的保护成员是不可能的,如果想这么做那么必须把类的成员都生命成为public(共用的),然而这做带来的问题遍是任何外部函数都可以毫无约束的访问它操作它,c++利用friend修饰符,可以让一些你设定的函数能够对这些保护数据进行操作,避免把类成员全部设置成public,最大限度的保护数据成员的安全. 友元能够使得普通函数直接访问类的保护数据,避免了类成员函数的频繁调用,可以节约处理器开销,提高程序的效率,

C++运算符重载 成员函数与友元函数详解

以下是对C++运算符重载 成员函数与友元函数进行了介绍,需要的朋友可以过来参考下   复制代码 代码如下: #include<iostream> using namespace std; class A {     int x,y;     public:     A(int xx,int yy):x(xx),y(yy){}     A(){x=0;y=0;}     A operator+(const A&b) //不加const限定,也可以     { return A(x+b.x

解析C++中不能重载为友元函数的四个运算符

以下是对C++中不能重载为友元函数的四个运算符进行了详细的分析介绍,需要的朋友可以过来参考下   C++规定有四个运算符 =, ->, [], ()不可以是全局域中的重载(即不能重载为友员函数),这是为什么呢? 现在先说说赋值运算符"="的重载 C++规定赋值运算符"="只能重载为类的非静态成员函数,而不可以重载为类的友元函数. 不能重载为类的静态成员应该比较容易理解,因为静态成员函数是属于整个类的,不是属于某个对象的,它只能去操作类静态数据成员.而赋值运算符

c++-C++ 如何提供独立的友元的函数声明?

问题描述 C++ 如何提供独立的友元的函数声明? <C++ Primer>第五版,中文版.242 页. 能不能给个例子?看书上的描述看不明白. 解决方案 在类申明里加上friend申明函数,在类外面定义函数.http://blog.chinaunix.net/uid-790245-id-2037327.html 解决方案二: 大概有下面两种情况需要使用友元函数:(1)运算符重载的某些场合需要使用友元.(2)两个类要共享数据的时候. 优点:能够提高效率,表达简单.清晰. 缺点:友元函数破环了封装

解决友元类(friend class)无法继承的问题

解决友元类(friend class)无法继承的问题   友元声明friend class是无法继承的.举例说明:class A声明class B为其友元类,也就是说class A授予class B访问class A的所有包括私有成员在内的所有成员.如果class C 继承class B.那么class C是不具备这种特权的.     但是如果我想在class C中访问class A的某个私有或者保护成员函数怎么办? 我们可以把工作交给父类.   #include <iostream> usi