最近工作好累呀,晚上总是失眠,自学c++的步骤都放慢了,本来之前看c++ primer的,结果这本书讲的太细节了,初学者不是很好把握。所以我又重新找了个教程,比较适合初学者。今天学习到友元函数和友元类了。

面向对象讲究的是封装,针对封装程度,我们将封装分为private,protected,public,分别对应了三种不同的访问权限。private的成员,仅在对象内部是可以访问的。protected是在该对象内部以及子类中可以使用。public是任意访问。但是有时候也会需要在其他类或函数中来访问private或protected的成员,因此友元有了市场。

友元的英文是friend,由于c++并不是完全的面向对象语言,因此函数未必就是对象中的一部分,so...友元的使用就分为友元函数和友元类了。

友元函数

定义:friend returntype function_name(class); 不过该函数的声明,需要在class类中来进行。注意,在类中定义的函数,如果前面加了friend标志,则说明该函数并不是该类的成员函数,而是友元函数。

我写了个例子。请参考:

class Tangle
{
private:
int x;
int y;
public:
Tangle(int,int);
Tangle();
~Tangle();
int print();
friend Tangle doubled(Tangle);
};

类的实现如下:

Tangle::Tangle(int a,int b)
{
x = a;
y = b;
}
Tangle::Tangle()
{
x = 1;
y = 1;
}
Tangle::~Tangle()
{
} int Tangle::print()
{
cout << "x = " << x << endl;
cout << "y = " << y << endl;
return 0;
} Tangle doubled(Tangle t)
{
Tangle ta;
ta.x = t.x *2;
ta.y = t.y *2;
return ta;
}

注意哦....上面的doubled()函数可不是Tangle类的成员函数哦。。。从该函数的实现来看,就知道了。前面根本没有作用域的符号::。

写个测试main方法:

int main()
{ Tangle ta1;
Tangle ta2(12,21);
ta1.print();
ta1 = doubled(ta2);
ta1.print();
return 0;
}

该方法就是定义两个对象ta1,ta2,将ta2的成员变量通过构造函数赋值,然后通过友元函数直接来操作ta1的成员变量。通过我们定义的友元函数的逻辑,就可以知道,ta1.x = ta2.x *2,ta1.y = ta2.y*2。因此结果就很明显了。运行结果如下:

友元类

我们在上面代码的基础上,再定义一个类,毕竟友元类是一种关系么,关系的存在是要有关系双方的。

class Ctangle
{
private:
int x;
int y;
public:
Ctangle();
~Ctangle();
friend class Tangle;
};

从上面的声明中,我们将Tangle类定义为Ctangle类的友元类,也就是说在Tangle类中可以访问Ctangle类的私有变量。看看Ctangle类的实现吧,我们此处仅用定义Ctangle类的私有变量即可。

Ctangle::Ctangle()
{
x = 100;
y = 200;
}
Ctangle::~Ctangle()
{
cout << "ctangle destruct..." << endl;
}

在Tangle类中声明一个函数来操作Ctangle类。

class Tangle
{
private:
int x;
int y;
public:
Tangle(int,int);
Tangle();
~Tangle();
int print();
void print(Ctangle);
friend Tangle doubled(Tangle);
};

Tangle类的实现如下:

Tangle::Tangle(int a,int b)
{
x = a;
y = b;
}
Tangle::Tangle()
{
x = 1;
y = 1;
}
Tangle::~Tangle()
{
} int Tangle::print()
{
cout << "x = " << x << endl;
cout << "y = " << y << endl;
return 0;
}
//Tangle类的友元函数
Tangle doubled(Tangle t)
{
Tangle ta;
ta.x = t.x *2;
ta.y = t.y *2;
return ta;
}
//Tangle类中来操作Ctangle类的函数
void Tangle::print(Ctangle ct)
{
cout << ct.x << endl;
cout << ct.y << endl;
}

测试的main函数如下:

int main()
{
Ctangle ct;
Tangle t(1,2);
t.print(ct);
return 0;
}

Ctangle类默认的构造函数将该类对象的私有变量初始化为100,200.我们定义一个tangle类来打印ctangle类中的私有成员。

至此,我们通过ctangle类的友元类来打印了ctangle类的私有变量。此出仅仅举个例子说明,ctangle类的友元类,是可以访问ctangle类的私有成员的。

另外,还需要说明一点的是友元函数并不是相互的,比如说这里的例子,tangle类可以访问Ctangle类中的私有变量,而Ctangle类却不能访问Tangle类中的私有变量。

参考代码

将这篇文章完整的代码放在下面吧。

#include <iostream>
using namespace std; class Ctangle; class Tangle
{
private:
int x;
int y;
public:
Tangle(int,int);
Tangle();
~Tangle();
int print();
void print(Ctangle);
friend Tangle doubled(Tangle);
}; class Ctangle
{
private:
int x;
int y;
public:
Ctangle();
~Ctangle();
friend class Tangle;
}; Ctangle::Ctangle()
{
x = 100;
y = 200;
}
Ctangle::~Ctangle()
{
cout << "ctangle destruct..." << endl;
} Tangle::Tangle(int a,int b)
{
x = a;
y = b;
}
Tangle::Tangle()
{
x = 1;
y = 1;
}
Tangle::~Tangle()
{
} int Tangle::print()
{
cout << "x = " << x << endl;
cout << "y = " << y << endl;
return 0;
} Tangle doubled(Tangle t)
{
Tangle ta;
ta.x = t.x *2;
ta.y = t.y *2;
return ta;
} void Tangle::print(Ctangle ct)
{
cout << ct.x << endl;
cout << ct.y << endl;
} int main()
{ /**
Tangle ta1;
Tangle ta2(12,21);
ta1.print();
ta1 = doubled(ta2);
ta1.print();
**/ Ctangle ct;
Tangle t(1,2);
t.print(ct);
return 0;
}

c++学习之友元的更多相关文章

  1. C++学习之友元类和友元函数

    C++学习之友元类和友元函数       模板类声明也可以有友元,模板的友元可以分为以下几类:        1.非模板友元:        2.约束模板友元,即就是友元的类型取决于类被实例化的时候的 ...

  2. C++学习12 友元函数和友元类

    友元函数和友元类在实际开发中较少使用,想快速学习C++的读者可以跳过本节. 一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有 ...

  3. C++学习笔记--友元

    C++控制对类对象私有部分的访问,在外部无法直接访问类的私有或保护成员.通常,公有类方法提供唯一的访问途径.有时这种限制太严格,不适合特定的编程问题.所以C++提供了友元这种形式,通过让函数或类成为类 ...

  4. C++学习012友元

    何为友元,我的理解,友元就是把另一个类当作是我的朋友,朋友之间,是可以访问一些私有的变量的. 所以,当我们将一个累声明为自己的友元类的时候,那么这个类就可以访问我们自己类中的某些私有变量等 当我把某个 ...

  5. C++学习笔记之友元

    一.引言 C++控制对类对象私有部分(private)的访问,通常只能通过公有的(public)类方法去访问.但是有时候这种限制太严格,不适合特定的问题,于是C++提供了另外一种形式的访问权限:友元. ...

  6. C++学习5-面向对象编程基础(构造函数、转换构造、静态数据成员、静态成员函数、友元)

    知识点学习 类 const作用 C语言的const限定符的含义为"一个不能改变值的变量",C++的const限定符的含义为"一个有类型描述的常量": const ...

  7. C++ 学习笔记(五)类的知识小结一(重载,友元函数,静态成员,new)

    ---恢复内容开始--- 学习C++类知识点还是挺多的,每个知识点学习的时候都觉得这个知识点咋那么多东西,其实真学完了再回头看好像也就那么点.这次用程序写一个黑猫揍白猫的故事总结一下这段时间学习的零碎 ...

  8. 初探C++运算符重载学习笔记&lt;2&gt; 重载为友元函数

    初探C++运算符重载学习笔记 在上面那篇博客中,写了将运算符重载为普通函数或类的成员函数这两种情况. 以下的两种情况发生.则我们须要将运算符重载为类的友元函数 <1>成员函数不能满足要求 ...

  9. C++学习笔记 构造&析构 友元 new&delete

    构造&析构函数 构造函数 定义:与类同名,可以有参可以无参,主要功能用于在类的对象创建时定义初始化的状态,无返回值,也不能用void修饰,构造函数不能被直接调用,必须通过new运算符在创建对象 ...

随机推荐

  1. 牛客练习赛1 B - 树

    链接:https://www.nowcoder.com/acm/contest/2/B来源:牛客网 题目描述 shy有一颗树,树有n个结点.有k种不同颜色的染料给树染色.一个染色方案是合法的,当且仅当 ...

  2. Python并发编程-协程实现socketserver

    #server.py from gevent import monkey;monkey.patch_all() import socket import gevent sk = socket.sock ...

  3. Linux系统内存管理

    <linux 内存管理模型> 下面这个图将Linux内存管理基本上描述完了,但是显得有点复杂,接下来一部分一部分的解析. 内存管理系统可以分为两部分,分别是内核空间内存管理和用户空间内存管 ...

  4. Codedforces 1076G Array Game 线段树

    题意 现在cf上看题意真nm麻烦,有道网页翻译和谷歌翻译鬼畜的一匹 两个人在玩一个游戏. 有一个有\(n\)个数序列\(B\),一开始有一个棋子在\(B\)的第一个位置. 双方轮流操作,第一次操作前将 ...

  5. 【洛谷】2607: [ZJOI2008]骑士【树形DP】【基环树】

    P2607 [ZJOI2008]骑士 题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一 ...

  6. 【JavaScript代码实现三】JS对象的深度克隆

    function clone(Obj) { var buf; if (Obj instanceof Array) { buf = []; // 创建一个空的数组 var i = Obj.length; ...

  7. Codeforces Round VK Cup 2015 - Round 1 (unofficial online mirror, Div. 1 only)E. The Art of Dealing with ATM 暴力出奇迹!

    VK Cup 2015 - Round 1 (unofficial online mirror, Div. 1 only)E. The Art of Dealing with ATM Time Lim ...

  8. Codeforces Round #280 (Div. 2) E. Vanya and Field 思维题

    E. Vanya and Field time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  9. ASP.NET 构建高性能网站 第4篇

    部署优化 我们都知道,不同的部署方式对站点的性能是有影响的,可能有些朋友已经知道了这点,不管怎样,我们这里还是详细系统的讲述一下这个问题,熟悉的朋友权当回顾J. Release方式编译项目 如果我们的 ...

  10. 在WAMPSERVER下增加多版本的PHP(PHP5.3,PHP5.4,PHP5.5)完美支持。

    WAMPServer可以让开发者在Windows系统下快速搭建WAMP环境,它支持多版本的Apache.MySQL.PHP之间的相互切换,互不影响,对于PHPer开发者来讲极为方便快速. 以下是在WA ...