首页 > 编程语言 >C++类中的友元

C++类中的友元

时间:2023-12-12 21:32:35浏览次数:32  
标签:友元 函数 int C++ add 声明 class 类中

声明关键字

template<class T>
friend T T_Name//这里的T表示声明的类型,T_Name表示类型名称

友元声明的作用

在一个类中,如果某个成员被private修饰而封装起来,对于外部的函数是无法访问到该成员信息的 但如果对外部访问函数进行友元修饰,函数就可以对类中的封装成员进行访问

#include<iostream>

class Building {
	friend void visit(Building* building);//友元的声明必须包含函数的签名,不能只包含函数名
private:
	std::string m_Sroom;
	std::string m_Broom;
public:
	Building() {
		m_Broom = "卧室";
		m_Sroom = "客厅";
	}
};

void visit(Building* building) {//这里如果未声明visit为友元函数,对于Building函数中的私有成员是无法进行访问的
	std::cout << building->m_Sroom << std::endl;
	std::cout << building->m_Broom << std::endl;
}

void test01() {
	Building* b = new Building;
	visit(b);
}
int main(void) {
	test01();
	return 0;
}

友元的不同类型

类类型的友元

#include<iostream>
class Add;

class members {
	friend void Add::add(members* m);
private:
	int a = 10;
	int b = 20;
};

class Add {
public:
	void add(members* m) {
		std::cout << m->a + m->b << std::endl;
	}
};

void test01() {
	Add a;
	auto m = new members;
	a.add(m);
}
int main(void) {
	test01();
	return 0;
}

其他类中的成员函数作友元

成员函数声明友元时,要注意声明的顺序,在声明其它类的成员函数时,需要保证友元声明前该类已经完成定义,因为类只有在完成定义之后才能访问其内部成员,编译器先执行声明操作,随后再执行函数定义,如果友元声明时类未完成定义,那么友元声明就不会执行。

#include<iostream>
class Son;

class Father {
public:
	int add(Son s);
};

class Son {
	friend int Father::add(Son s);
private:
	const int a = 10;
	const int b = 20;
};

int Father::add(Son s) {
	return s.a + s.b;
}

void test01() {
	Father f;
	Son s;
	int ans = f.add(s);
	std::cout << ans << std::endl;
}
int main(void) {
	test01();
	return 0;
}

注意声明其它类的成员函数的友元时声明的顺序,应当保证友元声明的类的作用域前声明的成员函数所属的类有完整定义,如果不存在完整定义,则友元声明会失效。

标签:友元,函数,int,C++,add,声明,class,类中
From: https://blog.51cto.com/u_16271511/8791265

相关文章

  • c++ 多线程
    https://blog.csdn.net/sjc_0910/article/details/118861539unique_lock和lock_guard多线程是一种实现并发处理的有效方式,C++11开始引入了<thread>库,使得多线程编程更加容易和高效。以下是C++中多线程编程的一些主要内容:线程的创建:在C++中,可以使用std::thread类来创建一......
  • 使用C++和QT实现Log自定义日志系统
    MyLog说明使用QT的qInstallMessageHandler函数结合qDebug,qInfo实现自定义的日志系统输出日志到文件和控制台自动检测日志文件大小自动更新日志文件修改日期自动备份自动删除一个月前的日志文件支持多线程程序支持扩展,可输出日志到数据库,网络,或服务器支持扩展,可使用co......
  • 关于c++序列化
    对于一个复杂数据对象的存储和装载有很多方式,比如自定义的文本或者2进制格式,以及对应的读取和写入程序。也有一些适应力较强比较通用的方式,文本的有xml和json。尤其是xml文件查看起来比较方便。但是xml的最大问题就是装载和保存都比较慢。装载1个大文件足以把头发等白:)在c++里......
  • C++学习笔记八:极限和数学运算<limits><cmath>
    1)<limits>库:1.1源文档:https://en.cppreference.com/w/cpp/types/numeric_limits#include<limits> 1.2库函数:函数解释:对于一个浮点数,lowest表示最小的可表示的负数,min表示最小的可表示的接近0的数,max表示最大的可表示的正数对于一个有符号整数,min表示可以表示的最小的......
  • 12.12邻接表存储实现图的深度优先遍历(c++)
    今天学习了数据结构中的邻接表存储实现图的深度优先遍历,其中让我受益匪浅,以下是我的解题思路。编写程序,实现由邻接表存储实现无向图的深度优先搜索遍历的功能。顶点为字符型。输入格式:第一行输入顶点个数及边的个数,第二行依次输入各顶点,第三行开始依次输入边的两个顶点,用空格......
  • 12.11 迪杰斯特拉方法实现最短路径(c++)
     今天通过自主学习,,对数据结构中的迪杰斯特拉方法实现最短路径进行了深造,让我学会了很多新的东西。首先是问题描述:用迪杰斯特拉算法实现有向网的最短路径输入格式:第一行输入有向网的顶点和边数,第二行输入各顶点值,用空格间隔,第三行开始输入各条边的两个点的及边上的权值,用空......
  • C++ Qt开发:SpinBox数值微调框组件
    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QSpinBox精度数值组件的常用方法及灵活运用。QSpinBox是Qt框架中的一个部件(Widget),用于提供一个方......
  • 学习C++算法入门第二天
    头文件#include<iostream> i=input,o=outputusingnamespacestd;头文件函数:https://blog.csdn.net/qq_32699009/article/details/104615792参考这个HelloWorld!---C学过,第一次接触C++,开启新的语言学习cin>>输入;cout<<输出<<endl; 啥是闰年?---非整百年:能被4整除的为闰......
  • C++语言string、wstring、utf-8互转
    实现了一个CStrCvt类,采用STL实现,可跨平台。注意的是,在s2ws和ws2s函数中需要locale信息,在使用过程中,需要根据实际情况进行设置。如果有需要可以检测文本编码,网上有开源的第三方库,可供使用。不过,准确率需自己判断。为了不影响效率,此类默认按照中文处理。头文件classCStrCvt{pu......
  • 算法战斗第一天C++1
    A.Watermelon西瓜(timelimitpertest:1second,memorylimitpertest:64megabytes,input:standardinput,output:standardoutput)OnehotsummerdayPeteandhisfriendBillydecidedtobuyawatermelon.Theychosethebiggestandtheripest熟one,int......