⭐本篇重点:友元,内部类,匿名对象
⭐本篇代码:c++学习/03.c++类与对象-下篇 · 橘子真甜/c++-learning-of-yzc - 码云 - 开源中国 (gitee.com)
目录
一. 友元
友元分为友元函数和友元类,它可以帮助我们突破封装的限制。在某些场合下为我们提供了便利,但是由于其破坏了封装,我们尽量不去使用它
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