[C++核心编程-07]----C++类和对象之友元应用

🎩 欢迎来到技术探索的奇幻世界👨‍💻

📜 个人主页:@一伦明悦-CSDN博客

✍🏻 作者简介: C++软件开发、Python机器学习爱好者

🗣️ 互动与支持:💬评论      👍🏻点赞      📂收藏     👀关注+

如果文章有所帮助,欢迎留下您宝贵的评论,点赞加收藏支持我,点击关注,一起进步!

目录

引言                   

正文

01-友元简介                   

02-全局函数做友元                   

03-类做友元                   

04-成员函数做友元                   

总结                   


引言                   

        在C++中,友元(friend)是一种权限控制机制,让一个类的非成员函数或其他类的成员函数能够访问该类的私有成员。友元函数和友元类可以访问类的私有和保护成员,但它们并不是类的成员。

        友元(friend)是C++中的一个特殊机制,它允许一个函数或者类访问另一个类的私有成员。在面向对象编程中,类通常将成员变量和成员函数分为公有(public)、私有(private)和保护(protected)三种访问权限。公有成员可以被类的对象直接访问,而私有成员则只能被该类的成员函数访问,不能被外部函数或其他类访问。友元机制允许某些函数或类突破这种封装性,可以直接访问类的私有成员。

        友元的主要用途包括但不限于:

     (1)允许外部函数访问类的私有成员:有时候,可能需要一些函数能够直接访问类的私有成员以完成某些任务,这时可以将这些函数声明为类的友元函数。

     (2)提供不同类之间的访问权限:有时候,可能需要两个类之间共享信息,但这些信息又不适合设置为公有成员,这时可以将一个类声明为另一个类的友元类。        友元机制的使用应该谨慎,因为它破坏了类的封装性,可能导致代码耦合性增加,降低代码的可维护性和可读性。

        友元类的作用是让一个类的成员函数可以访问另一个类的私有成员。

正文

01-友元简介                   

        生活中你的家有客厅(Public),有你的卧室(Private) 客厅所有来的客人都可以进去,但是你的卧室是私有的,也就是说只有你能进去 但是呢,你也可以允许你的好闺蜜好基友进去。

        在程序里,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术。

        友元的目的就是让一个函数或者类 访问另一个类中私有成员

        友元的关键字为 ==friend==

        友元的三种实现:全局函数做友元;类做友元;成员函数做友元        

        在C++中,友元可以是函数,也可以是类。友元函数和友元类可以访问类的私有成员,但它们并不是类的成员。友元函数有两种形式:非成员函数友元和友元类。

        (1)非成员函数友元

        下面是一个示例代码,其中定义了一个名为Student的类,同时定义了一个非成员函数printName(),并将其声明为Student类的友元函数,可以访问Student类的私有成员:

#include <iostream>
#include <string>
using namespace std;

class Student {
private:
    string name;
public:
    Student(string n) : name(n) {}
    
    friend void printName(Student s);
};

void printName(Student s) {
    cout << "Student name: " << s.name << endl;
}

int main() {
    Student stu("Alice");
    printName(stu);
    
    return 0;
}

        (2)友元类

        下面是一个示例代码,创建了两个类ClassA和ClassB,其中ClassA将ClassB声明为友元类,从而允许ClassB类的成员函数访问ClassA类的私有成员:

#include <iostream>
using namespace std;

class ClassA {
private:
    int num;
public:
    ClassA(int n) : num(n) {}
    
    friend class ClassB;
};

class ClassB {
public:
    void printNum(ClassA a) {
        cout << "Number from ClassA: " << a.num << endl;
    }
};

int main() {
    ClassA objA(10);
    ClassB objB;
    
    objB.printNum(objA);
    
    return 0;
}

        注:友元函数和友元类虽然提供了更灵活的权限控制机制,但也破坏了类的封装性,可能导致代码耦合性增加。因此,在使用友元时应慎重考虑。

02-全局函数做友元                   

        在C++中,全局函数作为友元是一种常见的使用情况,在这种情况下,全局函数被声明为某个类的友元函数,从而可以访问该类的私有成员,但并不是类的成员函数。全局函数作为友元可以方便地实现不属于类成员函数的功能,同时访问类的私有成员。

        下面是一个示例代码,展示了如何使用全局函数作为友元:

        在示例中,全局函数displayYear()被声明为Car类的友元函数,可以访问Car类的私有成员brandyear。在main()函数中,通过创建Car对象myCar并调用displayYear()函数,实现了打印汽车品牌和年份的功能。通过友元函数,实现了访问私有成员的操作,而不需要将私有成员改为公有。

        这种方式可以使得全局函数具有更强的灵活性,同时保持类的封装性,使程序更加模块化和可维护。但是在使用全局函数作为友元时也需要注意,友元函数的设计应该符合类的设计原则,避免滥用友元导致代码不可控制。

#include <iostream>
#include <string>
using namespace std;

class Car {
private:
    string brand;
    int year;
public:
    Car(string b, int y) : brand(b), year(y) {}

    friend void displayYear(Car c);
};

void displayYear(Car c) {
    cout << "Car brand: " << c.brand << ", Year: " << c.year << endl;
}

int main() {
    Car myCar("Toyota", 2021);
    displayYear(myCar);

    return 0;
}

        下面给出具体代码分析全局函数做友元的具体应用过程,示例演示了如何在C++中使用全局函数作为友元函数,从而访问类的私有成员。代码具体解释:

        a、首先,定义了一个名为Building的类,其中有一个公有成员变量m_SittinRoom和一个私有成员变量m_BedRoom

        b、紧接着,在类的定义中使用了friend关键字,将全局函数goodFriend声明为Building类的友元函数。这意味着goodFriend函数可以访问Building类的私有成员。

        c、全局函数goodFriend定义在类的外部,接受一个Building对象的引用作为参数。

        d、在goodFriend函数中,通过参数building访问了Building类的公有成员变量m_SittinRoom,并输出其值。然后尝试访问了Building类的私有成员变量m_BedRoom,同样输出其值。

   e、test01函数中创建了一个Building对象building,并调用了goodFriend函数,将该对象传递给它。

        f、在main函数中调用了test01函数,执行了示例的主要功能。

#include <iostream>
using namespace std;
#include <string>

class Building
{
	friend void goodFriend(Building &building);

public:
	Building()
	{
		m_SittinRoom = "客厅";
		m_BedRoom = "卧室";
	}

public:
	string m_SittinRoom;   // 客厅


private:
	string m_BedRoom;   // 卧室

};

// 如果传入的参数是引用类型传参,下方访问属性时不能使用指针方式->,使用.即可
void goodFriend(Building &building)
{
	cout << "好朋友全局函数  正在访问: " << building.m_SittinRoom << endl;

	// 私有属性无法访问  ,但是在类中加入friend void goodFriend(Building *building);这个声明,就可以访问
	cout << "好朋友全局函数  正在访问: " << building.m_BedRoom << endl;

}
void test01()
{
	Building building;
	goodFriend(building);
}

int main()
{

	test01();


	system("pause");
	return 0;
}

        示例运行结果如下图所示:

03-类做友元                   

        在C++中,除了全局函数可以作为友元外,类本身也可以作为另一个类的友元,这种情况下被称为类做友元。类做友元的主要作用是让一个类的成员函数可以访问另一个类的私有成员。通过设置友元关系,可以在一定程度上突破类的封装性,实现类之间的信息共享。

        下面是一个示例代码,展示了一个类作为另一个类的友元的情形:

        在示例中,MyClass类中定义了私有成员变量myData,并将FriendClass类声明为友元类。FriendClass类中的displayData函数可以访问MyClass类的私有成员变量myData。在main函数中,创建了MyClass对象objFriendClass对象friendObj,并调用friendObjdisplayData函数传入MyClass对象obj来访问私有成员变量myData

        通过类做友元,不同类之间可以相互访问私有成员,但需要注意友元关系可能导致耦合度增加,应该慎重使用以维护代码的封装性和可维护性。

#include <iostream>
#include <string>
using namespace std;

class FriendClass; // 提前声明FriendClass类

class MyClass {
private:
    int myData;

public:
    MyClass(int data) : myData(data) {}

    friend class FriendClass; // 将FriendClass类声明为友元类
};

class FriendClass {
public:
    void displayData(MyClass m) {
        cout << "FriendClass is accessing private data: " << m.myData << endl;
    }
};

int main() {
    MyClass obj(100);
    FriendClass friendObj;
    friendObj.displayData(obj);

    return 0;
}

        下面给出具体代码分析类做友元的应用分析,这个示例演示了如何在C++中使用类做友元,即一个类允许另一个类访问自己的私有成员。代码具体解释如下:

        a、首先,定义了两个类:BuildinggoodGay

        b、在Building类中,使用friend关键字声明了goodGay类为友元类,这意味着goodGay类可以访问Building类的私有成员。

   c、Building类有两个成员变量,m_SittingRoomm_BedRoom,分别表示客厅和卧室。其中,m_BedRoom是私有成员,只能在类内部访问。

        d、构造函数Building::Building()初始化了客厅和卧室的成员变量。

   e、goodGay类有一个成员指针building指向Building类的对象,并在构造函数中为其动态分配了内存。

   f、goodGay类有一个公有成员函数visit(),用于访问Building类的私有成员。在该函数中,通过building指针访问了Building类的私有成员变量m_SittingRoomm_BedRoom,并输出它们的值。

   g、test01()函数创建了一个goodGay对象gg,并调用了它的visit()函数。

        h、在main函数中,调用了test01()函数,执行了示例的主要功能。

        总体来说,这个示例展示了如何通过类做友元的方式,在一个类中访问另一个类的私有成员,从而实现了信息的共享。

#include <iostream>
using namespace std;
#include <string>

class Building;
class goodGay
{
public:
	goodGay();
	void visit();
private:
	Building *building;
};
class Building
{
	//告诉编译器 goodGay类是Building类的好朋友,可以访问到Building类中私有内容
	friend class goodGay;
public:
	Building();
public:
	string m_SittingRoom; //客厅
private:
	string m_BedRoom;//卧室
};
Building::Building()
{
	this->m_SittingRoom = "客厅";
	this->m_BedRoom = "卧室";
}
goodGay::goodGay()
{
	building = new Building;
}
void goodGay::visit()
{
	cout << "好基友正在访问" << building->m_SittingRoom << endl;
	cout << "好基友正在访问" << building->m_BedRoom << endl;
}
void test01()
{
	goodGay gg;
	gg.visit();
}
int main() {
	test01();
	system("pause");
	return 0;
}

        示例运行结果如下图所示:

 04-成员函数做友元                   

        在C++中,除了全局函数和类可以作为友元外,类的成员函数也可以作为另一个类的友元函数,这种情况下被称为成员函数做友元。这种方式允许某个类的成员函数访问另一个类的私有成员。通过设置成员函数做友元,可以进一步细化访问权限,只允许某些特定的函数访问私有成员,而不是整个类。

        下面是一个示例代码,展示了一个类的成员函数作为另一个类的友元函数的情形:

        在上述示例中,MyClass类中定义了一个成员函数friendFunction,并将FriendClass类的成员函数声明为它的友元函数。FriendClass类中的displayData函数可以访问MyClass类的私有成员变量myData,而MyClass类中的friendFunction函数可以访问FriendClass类的私有成员变量secretData

        在main函数中,创建了MyClass对象objFriendClass对象friendObj,并调用了它们各自的友元函数,实现了跨类的私有成员访问。

#include <iostream>
#include <string>
using namespace std;

class FriendClass; // 提前声明FriendClass类

class MyClass {
private:
    int myData;

public:
    MyClass(int data) : myData(data) {}

    // 将FriendClass的成员函数声明为友元函数
    void friendFunction(FriendClass fc);
};

class FriendClass {
private:
    string secretData;

public:
    FriendClass(string data) : secretData(data) {}

    // 成员函数做友元,可以访问MyClass的私有成员
    void displayData(MyClass m) {
        cout << "FriendClass is accessing private data: " << m.myData << endl;
        cout << "FriendClass is accessing secret data: " << secretData << endl;
    }
};

// 在MyClass中定义成员函数friendFunction,该函数可以访问FriendClass的私有成员
void MyClass::friendFunction(FriendClass fc) {
    cout << "MyClass's friend function is accessing FriendClass's secret data: " << fc.secretData << endl;
}

int main() {
    MyClass obj(100);
    FriendClass friendObj("I am secret data");
    
    friendObj.displayData(obj); // FriendClass的成员函数访问MyClass的私有成员
    obj.friendFunction(friendObj); // MyClass的成员函数访问FriendClass的私有成员

    return 0;
}

        下面给出具体代码分析成员函数做友元的应用过程,这个示例演示了如何在C++中使用成员函数做友元,即一个类的成员函数允许另一个类访问自己的私有成员。下面是代码的具体解释:

        a、首先,定义了两个类:BuildinggoodGay

        b、在Building类中,使用friend关键字声明了goodGay类的成员函数visit()为友元函数,这意味着visit()函数可以访问Building类的私有成员。

   c、Building类有两个成员变量,m_SittingRoomm_BedRoom,分别表示客厅和卧室。其中,m_BedRoom是私有成员,只能在类内部访问。

        d、构造函数Building::Building()初始化了客厅和卧室的成员变量。

   e、goodGay类有一个成员指针building指向Building类的对象,并在构造函数中为其动态分配了内存。

   f、goodGay类有两个公有成员函数visit()visit2(),其中visit()函数是另一个类Building的友元函数,可以访问Building类的私有成员;而visit2()函数则无法访问Building类的私有成员。

   g、test01()函数创建了一个goodGay对象gg,并调用了它的visit()函数,从而访问了Building类的私有成员。

        h、在main函数中,调用了test01()函数,执行了示例的主要功能。

#include <iostream>
using namespace std;
#include <string>

class Building;
class goodGay
{
public:
	goodGay();
	void visit(); //只让visit函数作为Building的好朋友,可以发访问Building中私有内容
	void visit2();
private:
	Building *building;
};
class Building
{
	//告诉编译器 goodGay类中的visit成员函数 是Building好朋友,可以访问私有内容
	friend void goodGay::visit();
public:
	Building();
public:
	string m_SittingRoom; //客厅
private:
	string m_BedRoom;//卧室
};
Building::Building()
{
	this->m_SittingRoom = "客厅";
	this->m_BedRoom = "卧室";
}
goodGay::goodGay()
{
	building = new Building;
}
void goodGay::visit()
{
	cout << "好基友正在访问" << building->m_SittingRoom << endl;
	cout << "好基友正在访问" << building->m_BedRoom << endl;
}
void goodGay::visit2()
{
	cout << "好基友正在访问" << building->m_SittingRoom << endl;
	//cout << "好基友正在访问" << building‐>m_BedRoom << endl;
}
void test01()
{
	goodGay gg;
	gg.visit();
	
}
int main() {
	test01();
	system("pause");
	return 0;
}

        示例运行结果如下图所示:

总结                   

        综上所述:友元是C++中的一种机制,允许某些特定的函数或类访问另一个类中的私有成员。这种机制破坏了封装性,但在某些情况下是非常有用的。以下是关于友元的一些总结:

        友元函数:友元函数是一个不属于当前类的普通函数,但被允许访问类的私有成员。友元函数的声明应该在类的内部,通常在类的开头或结尾,使用 friend 关键字。友元函数的定义在类外部,但需要在函数名前加上类名以指明它是哪个类的友元函数。

        (1)友元类

        a、友元类是一个类,被允许访问另一个类中的私有成员。

        b、声明一个友元类时,在类的声明中使用 friend 关键字,使得该类可以访问当前类的私有成员。

        c、友元关系不具有传递性,即如果 A 类是 B 类的友元,B 类不一定是 A 类的友元。

        (2)成员函数做友元

        a、除了全局函数和类可以作为友元外,类的成员函数也可以作为另一个类的友元函数。

        b、成员函数做友元的方式可以进一步细化访问权限,只允许某些特定的函数访问私有成员,而不是整个类。

        (3)友元的使用场景

        a、当某些操作需要访问另一个类的私有成员时,可以使用友元机制。

        b、在一些特定的设计模式中,友元机制也可以用于实现更灵活的访问控制。

        (4)友元的注意事项

        a、友元破坏了类的封装性,增加了类之间的耦合性,因此应该谨慎使用。

        b、友元应该被合理地使用,仅在确实需要访问私有成员时才使用,避免滥用。

        c、友元关系应该尽可能地限制在必要的范围内,以保证代码的安全性和可维护性。

        通过友元机制,可以在一定程度上打破类的封装性,但需要在设计时慎重考虑,确保代码的可维护性和安全性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/613251.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

轻量级开源即时通讯项目:Open Im Server

Open Im Server&#xff1a;轻松搭建&#xff0c;随心沟通&#xff0c;让距离更近一步&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 Open IM Server 是一个基于 Go 实现的轻量级全功能开源即时通讯服务器项目&#xff0c;专为需要高度定制和扩展性的应用程序设计。…

GAME101-Lecture06学习

前言 上节课主要讲的是三角形的光栅化。重要的思想是要利用像素的中心对三角形可见性的函数进行采样。 这节课主要就是反走样。 课程链接&#xff1a;Lecture 06 Rasterization 2 (Antialiasing and Z-Buffering)_哔哩哔哩_bilibili 反走样引入 ​ 通过采样&#xff0c;得到…

18 分页:介绍

目录 简单例子 页表存在哪里 列表中究竟有什么 分页&#xff1a;也很慢 内存追踪 小结 在解决大多数空间管理问题上面&#xff0c;操作系统有两种方法&#xff1a; 第一种就是将空间分割成不同长度的分片&#xff0c;类似于虚拟内存管理中的分段&#xff0c;但是这个方法…

【redis】Redis五种常用数据类型和内部编码,以及对String字符串类型的总结

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…

设计模式 六大原则之单一职责原则

文章目录 概述代码例子小结 概述 先看下定义吧&#xff0c;如下&#xff1a; 单一职责原则的定义描述非常简单&#xff0c;也不难理解。一个类只负责完成一个职责或者功能。也就是说在类的设计中&#xff0c; 我们不要设计大而全的类,而是要设计粒度小、功能单一的类。 代码例…

提高Rust安装与更新的速度

一、背景 因为rust安装过程中&#xff0c;默认的下载服务器为crates.io&#xff0c;这是一个国外的服务器&#xff0c;国内用户使用时&#xff0c;下载与更新的速度非常慢&#xff0c;因此&#xff0c;我们需要使用一个国内的服务器来提高下载与更新的速度。 本文推荐使用字节…

AI大模型探索之路-训练篇15:大语言模型预训练之全量参数微调

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…

Linux 安裝 rpm包

下载 地址&#xff1a;https://developer.aliyun.com/packageSearch 安装 rpm -ivh lsof-4.87-6.el7.x86_64.rpmlsof -Ki|awk {print $2}|sort|uniq -c|sort -nr|head lsof | wc -l

读天才与算法:人脑与AI的数学思维笔记24_预测性文本生成器

1. 起源 1.1. 人类讲故事可能起源于“假如……”这种问答结构 1.2. 讲故事是人类做安全试验的一种方式 1.2.1. 如果你问一个人“假如……”&#xff0c;其实是在探索你的行为对他可能带来的影响 1.3. 最早出现的故事极有可能就源自我们对在周遭混乱的环境中寻找某种秩序的渴…

06_图(Graph)

图的定义 图&#xff08;Graph&#xff09;是由顶点的有穷非空集合和顶点之间的集合组成&#xff0c;通常表示为&#xff1a;G(V,E)&#xff0c;其中&#xff0c;G表示一个图&#xff0c;V是图G中顶点集合&#xff0c;E是图G中边的集合。 对于图的定义&#xff0c;需要注意的地…

矩阵和空间变换理解

矩阵和空间变换 把向量和矩阵相乘看作是空间变换&#xff0c;是其中一种看法 代数角度&#xff1a;向量的一行和矩阵的一列逐项相乘再相加等于新向量的一项 w代表原来坐标轴和新坐标轴之间的变换关系&#xff0c;而a和b体现的是原来向量的关系 矩阵代表的是旧坐标和新坐标之间…

Redis 实战之命令请求的执行过程

命令请求的执行过程 发送命令请求读取命令请求命令执行器&#xff08;1&#xff09;&#xff1a;查找命令实现命令执行器&#xff08;2&#xff09;&#xff1a;执行预备操作命令执行器&#xff08;3&#xff09;&#xff1a;调用命令的实现函数命令执行器&#xff08;4&#x…

深入了解 PCIe 6.0 的演变和优化

PCI-Express是继ISA和PCI总线之后的第三代I/O总线&#xff0c;即3GIO。由Intel在2001年的IDF上提出&#xff0c;后来PCI-SIG&#xff08;PCI特殊兴趣组织&#xff09;认证发布后才改名为“PCI-Express”。它的主要优势就是数据传输速率高&#xff0c;另外还有抗干扰能力强&…

Python 日志模块Loguru基本使用和封装使用

【一】介绍 Loguru是一个用于Python的日志库&#xff0c;它的设计目标是使日志记录变得简单、快速且易于阅读。 &#xff08;1&#xff09;Loguru介绍 简洁的API&#xff1a;Loguru提供了一个简洁的API&#xff0c;使得在Python项目中使用日志变得更加容易。只需导入loguru模…

flac和mp3的区别是什么?答案在这里

在数字音乐时代&#xff0c;音频格式的选择对于音质和文件大小的影响至关重要。FLAC和MP3是两种常见的音频格式&#xff0c;它们在音质和压缩方式上存在明显的差异。了解flac和mp3的区别&#xff0c;有助于我们在不同的场景下选择合适的音频格式&#xff0c;以获得最佳的音乐体…

N5183B是德科技n5183b信号源

181/2461/8938产品概述&#xff1a; 简  述&#xff1a; N5183B 频率范围&#xff1a;9 kHz 至 20 GHz&#xff0c;具有 AM、FM、相位调制功能。N5183B MXG X 系列微波模拟信号发生器拥有 9 kHz 至 40 GHz 的频率覆盖范围&#xff0c;以及接近 PSG 级别的相位噪声性能&…

使用 Express 框架构建的 Node.js web 应用程序

使用 Express 框架构建的 Node.js web 应用程序 ├── config │ └── config.js ├── middlewares │ └── errorHandler.js ├── routes │ ├── index.js │ ├── postRoutes.js │ └── userRoutes.js ├── .env ├── .gitignore ├── app.js ├…

【Centos7 】Centos7yum报错:another app is currently holding the yum lock;解决方案

Centos7 yum报错:another app is currently holding the yum lock;waiting for it to exit 大家好 我是寸铁&#x1f44a; 总结了一篇Centos7 yum报错:another app is currently holding the yum lock;waiting for it to exit✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 报错 解…

【Linux系统编程】第十六弹---冯诺依曼体系结构与操作系统

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、冯诺依曼体系结构 2、操作系统原理 2.1、什么是操作系统&#xff1f; 2.2、用图解释操作系统 2.3、理解操作系统 总结 …

上班工资太低了,哪些副业可以多赚钱?

今天给各位分享最赚钱的副业方式的知识&#xff0c;其中也会对比较赚钱的副业进行解释. 1、网站接单 一般20页左右的PPT报价基本在200-400元。如果能每周接单&#xff0c;一个月就有接近1000元的副业收入。提交摄影和绘画作品 比起画画&#xff0c;靠摄影赚点外快更容易一点。…