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

news2024/12/23 9:48:35

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

📜 个人主页:@一伦明悦-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、友元关系应该尽可能地限制在必要的范围内,以保证代码的安全性和可维护性。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Numpy求最大、最小值、求累乘、累和

Numpy求最大、最小值 代码举例&#xff1a; ​ 输出结果为&#xff1a; ​ 在这个例子中&#xff0c;我们首先导入了NumPy库&#xff0c;然后创建了一个3x3的矩阵A。接着&#xff0c;我们使用np.max()函数来求矩阵A的最大值&#xff0c;并将结果存储在变量max_value中&#xff…

【35分钟掌握金融风控策略20】贷前风控策略详解-5

目录 反欺诈模型体系和模型在策略中的应用 申请反欺诈评分卡模型 欺诈传导模型 欺诈团伙识别模型 GPS评分卡模型 如何在贷中应用贷前模型 反欺诈模型体系和模型在策略中的应用 反欺诈横型体系主要包括识别个体欺诈和识别团伙欺诈的两类模型。在贷前&#xff0c;常用的识别…

从入门到深入理解——栈

目录 一、栈的定义 二、栈的实现 2.1 栈的结构 2.2 栈的初始化 2.3 栈的销毁 2.3 栈元素的插入 2.4 栈元素的删除 2.5 栈顶元素获取 2.6 栈元素有效个数获取 2.7 栈是否为空判断 三、代码总览 Stack.h Stack.c 测试代码:test.c 四、例题 例一&#xff1a; 例二&#xff…

【Web后端】jsp基础知识_请求转发和重定向

1.jsp基础知识 1.1简介 java server page&#xff0c;运行在服务器端的页面java代码html代码java代码全部都放在<%%>中间 1.2jsp表达式 作用&#xff1a;将动态信息显示在页面上&#xff0c;以字符串方式&#xff0c;返回给浏览器端语法&#xff1a;<%变量或表达式…

Ubuntu18.04--虚拟机配置Samba并从Windows登录

前言&#xff1a; 本文记录我自己在Windows上安装 Virtualbox &#xff0c;并在Virtualbox中安装 Ubuntu-18.04 虚拟机&#xff0c;在Ubuntu-18.04虚拟机里安装配置Smaba服务器&#xff0c;从 Windows 宿主系统上访问虚拟机共享samba目录的配置命令。 引用: N/A 正文 虚拟…

【桌面应用开发】Rust+Tauri框架项目打包操作

1.项目npm install下载项目依赖&#xff08;需要配置好node.js环境&#xff09; 可参考&#xff1a;https://blog.csdn.net/m0_64346565/article/details/138319651 2.自定义图标&#xff08;项目初始化开始第一次需要配置生成&#xff0c;后面可跳过这一步骤&#xff09; Ta…

零基础HTML教程(32)--HTML5语义化标签

文章目录 1. div时代2. div的缺点3. 语义化标签4. 语义化标签有哪些5. 实战演练6. 小结 1. div时代 我是2009年开始学习网页开发的&#xff0c;那时候HTML里面到处是div。 这么说吧&#xff0c;那时候div就是网页的骨架&#xff0c;支撑着网页的主结构。 2. div的缺点 div作…

什么是IP跳变?

IP 跳跃&#xff08;也称为 IP 跳动&#xff09;的概念已引起使用代理访问网站的用户的极大关注。但 IP 跳跃到底是什么&#xff1f;为什么它对于各种在线活动至关重要&#xff1f; 在本文中&#xff0c;我们将深入探讨 IP 跳跃的世界&#xff0c;探索其实际应用、用例、潜在问…

二叉搜索树模拟实现

目录 认识二叉搜索树&#xff1a; 模拟实现&#xff1a; 节点结构体构建&#xff1a; insert&#xff08;插入&#xff09;: find&#xff08;查找&#xff09;&#xff1a; erase&#xff08;删除&#xff09;&#xff08;重点&#xff09;&#xff1a; 全部代码 认识二叉…

数据结构(十三)----几种特殊的树

目录 一.二叉排序树 1.二叉排序树的查找 2.二叉排序树的插入 3.二叉排序树的构造 4.二叉树的删除 5.二叉排序树的查找效率 二.平衡二叉树 1.平衡二叉树的插入 2.平衡二叉树的查找效率 3.平衡二叉树的删除 三.红黑树 1.红黑树的概念 2.红黑树的查找 3.红黑树的插入…

docker的centos容器使用yum报错

错误描述 学习docker过程中&#xff0c;基于 centos 镜像自定义新的镜像。拉取一个Centos镜像&#xff0c;并运行容器&#xff0c;容器安装vim&#xff0c;报错了。 报错&#xff1a;Error: Failed to download metadata for repo appstream: Cannot prepare internal mirror…

Linux系统编程——进程控制

目录 一&#xff0c;进程创建 1.1 fork回顾 1.2 写时拷贝 1.3 fork用处 1.4 fork调用失败原因 二&#xff0c;进程退出 2.1 进程退出场景 2.2 mainCRTStartup调用 2.3 进程退出码 2.3.1 main函数返回值 2.3.2 strerror ​编辑 2.3.3 命令的退出码 2.4 进程正常退…

P8803 [蓝桥杯 2022 国 B] 费用报销

P8803 [蓝桥杯 2022 国 B] 费用报销 分析 最值问题——DP 题意分析&#xff1a;从N张票据中选&#xff0c;且总价值不超过M的票据的最大价值&#xff08;背包问题&#xff09; K天限制 一、处理K天限制&#xff1a; 1.对于输入的是月 日的格式&#xff0c;很常用的方式是…

python代码实现xmind思维导图转换为excel功能

目录 转换前xmind示例 运行代码转换后excel示例 python代码 转换前xmind示例 运行代码转换后excel示例 如果想要合并单元格内容&#xff0c;在后面一列参考输入 B2&C2&D2&E2 python代码 from xmindparser import xmind_to_dict import pandas as pd from openp…

微服务项目实战-黑马头条(十三):持续集成

文章目录 项目部署_持续集成1 今日内容介绍1.1 什么是持续集成1.2 持续集成的好处1.3 今日内容 2 软件开发模式2.1 软件开发生命周期2.2 软件开发瀑布模型2.3 软件的敏捷开发 3 Jenkins安装配置3.1 Jenkins介绍3.2 Jenkins环境搭建3.2.1 Jenkins安装配置3.2.2 Jenkins插件安装3…

微信投票源码系统至尊版 吸粉变现功能二合一

源码简介 微信投票系统在营销和社交互动中发挥着多方面的作用&#xff0c;它能够提升用户的参与度和品牌曝光度&#xff0c;还是一种有效的数据收集、营销推广和民主决策工具。 分享一款微信投票源码系统至尊版&#xff0c;集吸粉变现功能二合一&#xff0c;全网独家支持礼物…

TEA: Temporal Excitation and Aggregation for Action Recognition 论文阅读

TEA: Temporal Excitation and Aggregation for Action Recognition 论文阅读 Abstract1. Introduction2. Related Works3. Our Method3.1. Motion Excitation (ME) Module3.1.1 Discussion with SENet 3.2. MultipleTemporal Aggregation(MTA) Module3.3. Integration with Re…

【RAG 论文】Contriever:对比学习来无监督训练文本嵌入模型

论文&#xff1a;Unsupervised Dense Information Retrieval with Contrastive Learning ⭐⭐⭐⭐⭐ Facebook Research, arXiv:2112.09118 Code&#xff1a;github.com/facebookresearch/contriever 一、论文速读 本文使用对比学习的方法来对文本检索模型做无监督学习训练&am…

HTTP基础概念和HTTP缓存技术

什么是HTTP HTTP是超文本传输协议&#xff0c;主要分为三个部分&#xff1a;超文本、传输、协议。 超文本是指&#xff1a;文字、图片、视频的混合体。传输是指&#xff1a;点与点之间的信息通信。协议是指&#xff1a;通信时的行为规范或约定 HTTP常见字段 字段名 解释 例…

Mac IDEA 自动补全mybatis sql语句

导航 Mac IDEA 自动补全mybatis sql语句一、点击IDEA 右侧Database选项二、选择添加对应数据库三、输入数据库信息和方案四、输入数据库信息和方案五、成功 Mac IDEA 自动补全mybatis sql语句 背景&#xff1a; 想在Mapper中&#xff0c;能够实现自动检索数据库表和对应的字段…