C++友元函数、友元类
1、什么是友元函数?
友元函数就是可以直接访问类的成员(包括私有数据)的非成员函数,也就是说他并不属于这个类,他是一种外部的函数。
一个外部函数只能通过类的授权成为这个类友元函数,这就涉及到一个关键字friend。因为我们的一个外部函数是无法访问一个类的私有数据的,当然可以访问
public修饰的变量,这就不叫私有数据了。
1、友元全局函数
(1)首先说明友元全局函数首先他是一个普通的全局函数,其次他是一个的类的友元函数,也就是意味着我们可以通过友元函数
访问类的私有数据和成员函数,当然首先这个友元函数的参数是一个这个类的引用、类的指针或者就是这个类对象。
(2)声明全局友元函数如下所示:
#include <iostream>
using namespace std; class Time{
friend void func(Time &t); // 声明全局函数为一个友元函数
public:
Time(int h, int m, int s) : i_mHour(h), i_mMin(m), i_mSecon(s) { } // 构造函数
private:
int i_mHour;
int i_mMin;
int i_mSecon;
}; static void func(Time &t) // 全局函数
{
cout << t.i_mHour << ":" << t.i_mMin << ":" << t.i_mSecon << endl;
} int main(void)
{
Time t = {, , };
func(t);
return ;
}
全局友元函数
2、友元成员函数
(1)首先说明友元成员函数是一个类的成员函数,其次他是另一个类的友元函数,所以我们也可以在这个函数中访问这个类的私有数据和成员函数
(2)声明友元成员函数如下所示:
#include <iostream>
using namespace std; class Time; class Print{
public:
void func(Time &t); // func函数是Time类的友元函数
}; class Time{
friend void Print::func(Time &t); // 声明Print类中的func函数是Time类的友元函数
public:
Time(int x, int y, int z) : i_mHour(x), i_mMin(y), i_mSecon(z) { }
private:
int i_mHour;
int i_mMin;
int i_mSecon;
}; void Print::func(Time &t)
{
cout << t.i_mHour << ":" << t.i_mMin << ":" << t.i_mSecon << endl; // 直接操作Time中的私有数据
} int main(void)
{
Time t(,,);
Print p;
p.func(t);
return ;
}
友元成员函数
3、友元类
(1)友元类就是在A类中将B类声明为A类的友元类,方法就是:friend 类名
(2)代码如下:
#include <iostream>
using namespace std; class Print; class Time{
friend Print; // 声明Print类为Time类的友元类
public:
Time(int x, int y, int z) : i_mHour(x), i_mMin(y), i_mSecon(z) { } // 构造函数
private:
int i_mHour;
int i_mMin;
int i_mSecon;
}; class Print{
public:
Print(int x, int y, int z) : t(x, y, z) { } // 构造函数
void func(void); // 可以在这个函数中去操作Time对象t的私有数据
private:
Time t; // 申明一个Time类对象
}; void Print::func(void)
{
cout << t.i_mHour << ":" << t.i_mMin << ":" << t.i_mSecon << endl; // 直接操作Time中的私有数据
} int main(void)
{
Print p(,,); // 定义一个Print类对象
p.func();
return ;
}
友元类
3、注意一些问题
(1)在类中声明的友元函数或者是友元类与类限定符没有任何关系,因为友元函数并不属于这个类,所以类的修饰限定符并不能对他起作用
class Time{
friend void func1(Time &t); // 一般申明在类的开头位置处
......
public:
friend void func2(Time &t); // 申明在public下
......
private:
friend void func3(Time &t); // 申明在private下
......
protected:
friend void func4(Time &t); // 申明在protected下
......
};
友元与限定符
(2)成员函数有this指针,而友元函数没有this指针。
(3)友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友,这个其实很好理解,也很合理。
(4)友元关系的单向性
A是B的友元,B不是A的友元
(5)友元声明的形式及数量不受限制
我们可以声明多个类的友元函数或者友元类,而且函数可以是一个运算符重载函数,也可以是其他的什么函数。
(6)友元只是封装的补充,其实是破坏了类的封装特性,所以我们如果能够不是用的情况尽量不要去使用。
C++友元函数、友元类的更多相关文章
- 不可或缺 Windows Native (20) - C++: 友元函数, 友元类
[源码下载] 不可或缺 Windows Native (20) - C++: 友元函数, 友元类 作者:webabcd 介绍不可或缺 Windows Native 之 C++ 友元函数 友元类 示例演 ...
- C++模板类内友元(友元函数,友元类)声明的三种情况
根据<C++ Primer>第三版16.4节的叙述,C++类模板友元分为以下几种情况 1.非模板友元类或友元函数. 书上给了一个例子: class Foo{ void bar(); ...
- c++友元函数友元类
友元函数和友元类的需要: 类具有封装和信息隐藏的特性.只有类的成员函数才能访问类的私有成员,程序中的其他函数是无法访问私有成员的.非成员函数可以访问类中的公有成员,但是如果将数据成员都定义为公有的,这 ...
- C++开发系列-友元函数 友元类
友元函数 默认一个类的私有属性只能在该类的内部可以直接访问.友元函数申明在内的内部,实现在类的外部可以直接访问类的私有属性. class A1 { public: A1() { a1 = 100; a ...
- C++学习之友元类和友元函数
C++学习之友元类和友元函数 模板类声明也可以有友元,模板的友元可以分为以下几类: 1.非模板友元: 2.约束模板友元,即就是友元的类型取决于类被实例化的时候的 ...
- 友元(友元函数、友元类和友元成员函数) C++
有些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍阻止一般的访问,这是很方便做到的.例如被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员. 友元(frend)机制允许一个类将 ...
- mfc 类的友元函数
知识点 友元函数 友元函数 友元函数是指某些虽然不是类成员却能够访问类的所有成员的函数..类授予它的友元特别的访问权.通常同一个开发者会出于技术和非技术的原因,控制类的友元和成员函数(否则当你想更新你 ...
- 【C++基础 05】友元函数和友元类
友元是一种定义在类外部的普通函数或类,但它须要在类体内进行说明,为了与该类的成员函数加以差别,在说明时前面加以keywordfriend. 友元不是成员函数,可是它能够訪问类中的私有成员. 友元的作用 ...
- C++ 类 & 对象-类成员函数-类访问修饰符-C++ 友元函数-构造函数 & 析构函数-C++ 拷贝构造函数
C++ 类成员函数 成员函数可以定义在类定义内部,或者单独使用范围解析运算符 :: 来定义. 需要强调一点,在 :: 运算符之前必须使用类名.调用成员函数是在对象上使用点运算符(.),这样它就能操作与 ...
随机推荐
- 【Xamarin】Visual Studio 2013 Xamarin for Android开发环境搭建与配置&Genymotion
Xamarin Xamarin是基于Mono的平台. Xamarin旨在让开发者可以用C#编写iOS, Android, Mac应用程序,也就是跨平台移动开发. 下载资源 1,进入Xamarin官方网 ...
- Jmeter二次开发之代码环境搭建(QQ交流群:577439379)
一.创建项目 1. 分别下载apache3.1 binaries和source两个压缩包,前者为release版本,后者为jmeter最新的源码,下载地址:http://jmeter.apache.o ...
- brave-zipkin的日志源码分析
其实在zipkin的日志里面作为发送端日志两个,sr,ss,这个日志是servlet产生的:接收端日志是四个,分别是cr,sr,ss,cs:cr和cs分别是上游的日志的信息:ss和sr是接收端输出的日 ...
- ffmpeg V4L2_BUF_FLAG_ERROR的解决方法
利用ffmpeg进行视频采集时经常出现“V4L2_BUF_FLAG_ERROR”的错误,并不再进行下帧的采集.通过借鉴下面的方法,对ffmpeg3.0.7版本进行补丁,能解决此类问题. 当某帧出错后, ...
- bzoj1037生日聚会
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1037 任意区间的话,可以从所有后缀区间考虑. 因为每一个区间一定是某一时刻的一个后缀区间,所 ...
- 在pydev安装完成后在eclipse不显示的问题
Java配置: http://www.jb51.net/os/win10/370409.html http://blog.csdn.net/wwd0501/article/details/521308 ...
- Window 端口占用
Windows平台 在windows命令行窗口下执行: 1.查看所有的端口占用情况 C:\>netstat -ano 协议 本地地址 外部地址 ...
- 利用PHP实现页面跳转同时POST传参,CURL不行
function payto(){ echo "<form style='display:none;' id='form1' name='form1' method='post' ac ...
- 【DataGuard】部署Data Guard相关参数详解 (转载)
原文地址:[DataGuard]部署Data Guard相关参数详解 作者:secooler 有关物理Data Guard部署参考<[DataGuard]同一台主机实现物理Data Gua ...
- PMP Fundamentals