首页 > 编程语言 >10.C++面向对象7(友元,匿名对象)

10.C++面向对象7(友元,匿名对象)

时间:2024-11-17 17:50:33浏览次数:3  
标签:友元 10 函数 int C++ month Date day

⭐本篇重点:友元,内部类,匿名对象

⭐本篇代码:c++学习/03.c++类与对象-下篇 · 橘子真甜/c++-learning-of-yzc - 码云 - 开源中国 (gitee.com)

目录

一. 友元

1.1 友元函数 

1.2 友元类 

二. 匿名对象 

一. 友元

友元分为友元函数和友元类,它可以帮助我们突破封装的限制。在某些场合下为我们提供了便利,但是由于其破坏了封装,我们尽量不去使用它

1.1 友元函数 

        当我们想在一个Date类中增加一个 << 操作符重载,这样我们就能够使用cout输出这个类的信息。根据已有知识,我们很快就能下出下例代码

#include <iostream>
using namespace std;

class Date
{
public:
	Date(int year = 0, int month = 1, int day = 1)
		:_year(year)
		,_month(month)
		,_day(day)
	{}

	//重载 << ,为了实现 cout << d1 << d2 ,我们需要返回out
	ostream& operator << (ostream & out)
	{
		out << _year << "/" << _month << "/" << _day << endl;
		return out;
	}
private:
	int _year;
	int _month;
	int _day;
};

int main()
{
	Date d1(2024, 11, 17);
	cout << d1;
	return 0;
}

 但是这里确显示报错了,如下图

这是因为<< 重载在类内部的原型是 

ostream& operator << (ostream & out);

 我们的第一个参数是隐藏的this,第二参数是out。那么我们应该这样去使用调用它

使用 d1 << cout; 成功输出了信息,但是这样明显不符合cout的调用!

为了修改参数的顺序,我们就需要使用友元函数

        友元函数可以直接访问类的私有成员,它是定义在类的外部普通函数,不属于某个类。我们使用它的时候需要在内部进行声明,声明需要加上关键字friend

        只有在这个类中声明了友元函数后,我们定义的友元函数才能访问这个类的私有成员

 

#include <iostream>
using namespace std;

class Date
{
	//友元函数的声明,只有声明后,友元函数才能访问私有成员
	friend ostream& operator<<(ostream& out, const Date& d);
public:
	Date(int year = 0, int month = 1, int day = 1)
		:_year(year)
		,_month(month)
		,_day(day)
	{}

private:
	int _year;
	int _month;
	int _day;
};

//定义友元函数
ostream& operator<<(ostream& out, const Date& d)
{
	out << d._year << "/" << d._month << "/" << d._day;
	return out;
}

int main()
{
	Date d1(2024, 11, 17);
	Date d2(1, 1, 1);
	cout << d1 << endl;
	cout << d1 << endl << d2 << endl;
	return 0;
}

运行结果如下:

注:

友元函数可以访问类的私有成员,但不是类的成员函数

不可使用const修饰友元函数

友元函数可以在类外任何地方进行定义,不受访问限定符影响

一个友元函数可以是多个类的友元函数

友元函数和普通函数的使用方法是一样的

1.2 友元类 

        我们可以在一个类A中声明另一个类B是它的友元类,这样B就能够访问A的成员

简单来说就是:A对B说,我声明了B是我的朋友,你可以随便访问我的变量

 

#include <iostream>
using namespace std;

class A
{
	friend class Date;
public:
	A(int a = 0)
		:_a(a)
	{}
private:
	int _a;
};

class Date
{
public:
	Date(int year = 0, int month = 1, int day = 1)
		:_year(year)
		,_month(month)
		,_day(day)
	{
		_A._a = 1;//可以直接访问A类的私有成员
	}

	void print()
	{
		cout << _year << "/" << _month << "/" << _day << endl;
		cout << _A._a;
	}
private:
	int _year;
	int _month;
	int _day;
	A _A;
};

int main()
{
	Date d1(2024 / 11 / 17);
	d1.print();
	return 0;
}

运行结果

二. 匿名对象 

见代码注释!

#include <iostream>
using namespace std;

class A
{
public:
	A(int a = 0)
		:_a(a)
	{}

	int add(int a, int b)
	{
		cout << a + b << endl;
	}
private:
	int _a;
};

int main()
{
	A a1(5); //正常定义对象

	A a2();//错误定义,这个是函数声明还是定义变量??

	//匿名对象,使用匿名对象可以去调用一些函数。在某些场景下还是很有用的!
	A();
	A().add(10, 12);
	return 0;
}

运行结果:

标签:友元,10,函数,int,C++,month,Date,day
From: https://blog.csdn.net/yzcllzx/article/details/143834558

相关文章

  • C++--多态语法介绍
    目录多态的概念多态的定义及实现多态的构成条件实现多态还有两个必须重要条件虚函数虚函数的重写/覆盖多态场景的⼀个选择题虚函数重写的⼀些其他问题协变析构函数的重写override和final关键字重载/重写/隐藏的对比纯虚函数和抽象类多态的原理虚函数表指针多态的原......
  • 20241023 模拟赛
    20241023模拟赛A.浇水考虑统计每个点被浇水了几次,容易用二维前缀和维护,最后如果这个点在对应颜色的矩阵里就扣除一个次数,最后有次数的就枯萎。B.藤养巴士赛时考虑树形dp,和树上差分解法殊途同归。设\(f_u\)表示,假设所有目标在\(u\)子树中的人都已经到了\(u\)子树中,......
  • 20241022 模拟赛
    20241022模拟赛A.枚举高手考虑dp,设\(f_{i,j}\)表示考虑到第\(i\)个数,和为\(j\)的答案,\(g_{i,j}\)表示方案数。考虑两种转移:一种是在原序列的末尾加上一个\(1\),一种是把现有的数一起加上\(1\),容易发现这样既能保证有序性又能不重不漏。时间复杂度\(O(nm)\)。最近总......
  • 10款免费开源的CMS建站系统,拿去接活吧!
    以下是10款轻量级免费开源CMS建站系统,支持独立建站私有化部署,并标注是否支持商用,拿去接私活吧:1.WordPress简介:WordPress是开源CMS。支持商用:✅可商用(GPLv2.0许可证)。特点:插件和主题生态。对SEO友好,适合博客、企业网站。2.DedeCMS(织梦CMS)简介:国内流行的......
  • 102. 二叉树的层序遍历【 力扣(LeetCode) 】
    文章目录零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码零、原题链接102.二叉树的层序遍历一、题目描述给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。二、测试用例示例1:输入:root=[3,9,20,null,nul......
  • C++类型转换详解
        在C语言和C++有很多的类型转换,内置类型(int,char,bool等等编译器自带的)之间的转换像隐式类型转换,强制类型转换,此外还有自定义类型(自己定义的类)和内置类型的转换,自定义类型间的转换,父类和基类之间的类型转换。总之C语言和C++的类型转换复杂多样,如果你对上面的内容有......
  • C++ lambda 表达式与「函数对象」(functor)
    C++lambda表达式与「函数对象」(functor)Created:2024-06-27T16:29+08:00Published:2024-11-17T17:01+08:00Categories:C-CPPfunctor(FunctionObject)首先要介绍的是functor——一个重载了operator()的类,该类的实例可以使用operator()。WhatareC++functorsand......
  • STM32F103开发
    本节我们将会对STM32的硬件资源进行介绍,包括如下内容:点亮LED;检测按键按下和松开事件;串口;点亮128*128TFT_LCD液晶屏;一、点亮LED1.1电路原理图LED电路原理图如下图所示:其中:LED1连接到PA8`引脚,低电平点亮;LED2连接到PD2引脚,低电平点亮;1.2GPIO引脚介绍STM32F103RTC......
  • C++ 模板
    C++模板Created:2024-03-24T20:24+08:00Published:2024-11-17T16:37+08:00Categories:CPP目录偏特化类模板函数模板形参包Question我记不住模板的语法,尤其是偏特化的语法,怎么办?面试问题利用类模板和函数模板实现编译器计算斐波那契数列模板的声明和定义为什么不能分开写......
  • c++入门基础后续
    1.缺省参数缺省参数是指在声明或定义的同时给上指定的一个缺省值,在调用函数是如果没有传指定的实参那么就会用这个缺省值。缺省参数分为全缺省和半缺省。全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃......