IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++中的友元&&类中默认存在的函数 -> 正文阅读

[C++知识库]C++中的友元&&类中默认存在的函数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、友元

1、啥是友元?

友元就是friend修饰函数或者类,友元只是单纯的提供一个场所赋予对象具有无视权限功能 (不是说直接可以访问另一个数据)

2、友元函数

1、友元函数不属于类,就是一个普通函数,类外实现不需要类名限定
2、以另一类的成员函数当做友元函数,要注意写法(注意顺序(声明与定义的顺序—必需先声名后定义))
3、 友元函数无论啥属性都可以,即无论是public、private、protected

#include<iostream>
#include<string>
using namespace std;
class MM {
public:
	MM() {}
	MM(string name,int age):name(name),age(age){}
	void print() {             //普通函数
		cout << name << "\t" << age << endl;
	}
	friend void printMM(MM&object);
protected:
	friend void printData(MM&object) {			//友元函数
		cout << "MM中的printData" << endl;
	}
protected:
	string name;
	int age;
};
void printMM(MM&object){
	name="李白";
	age=1000;
	cout<<name<<"\t"<<age<<endl;
}
int main() {
	MM mm("张飞", 19);
	mm.print();				//普通函数的调用
	printData(mm);			//友元函数的调用
	printMM(mm);
	while (1)
	{

	}
	return 0;
}

注意:友元函数在类外定义的时候,无需使用类名限定

3、友元类

在另一个中用friend修饰声明类,称之为友元类,友元类一般是在一个类中声名一个友元类

#include <iostream>
using namespace std;
class Boy 
{
	friend class Girl;		//友元类
public:
	Boy(string name, int age) :name(name), age(age) {}
private:
	void printBoy() 
	{
		cout << name << "\t" << age << endl;
	}
	string name;
	int age;
};

class Girl 
{
public:
	Girl(string name, int age) :boy(name, age) 
	{

	}
	void printInfo() 
	{
		cout << boy.name << "\t" << boy.age << endl;	//无视权限
		Boy* pB = new Boy("new", 19);			
		pB->printBoy();									//无视权限
	}
private:
	Boy boy;
};
//互为友元类

class Test
{
	friend class Data;
public:
	void printTest();
private:
	void test() 
	{
		cout << "测试权限专用函数" << endl;
	}
};
class Data
{
	friend class Test;
public:
	void printData()
	{
		Test tObject;
		tObject.test();
	}
private:
	void data()
	{
		cout << "测试权限专用函数" << endl;
	}
};
void Test::printTest() 
{
	Data dObject;
	dObject.data();
	cout << "printTest" << endl;
}
int main() 
{
	Test test;
	test.printTest();

	Data data;
	data.printData();
	return 0;
}

二、类中默认存在的函数

一、

当我们使用类创建对象的时候,有时我们明明没有写构造函数,但我们依然可以使用无参构造函数去构造对象。 但我们如果只写了有参构造函数,那我们就只能使用有参的方式构造对象,无法使用无参方式构造对象,这是为什么呢?
答:类中存在默认的构造函数—无参构造函数,当我们直接写了有参构造函数,原来默认的构造函数就会被覆盖(简单点说就是不存在了)。所以如果我们既要有参构造函数也需无参构造函数,那就需要都写上了。

二、类中除了存在默认的无参构造函数,还存在哪些默认的函数呢?
1.默认构造函数

MM() = default; //可以使用default表示该函数是使用的默认的

2、默认析构函数

~MM() = default;

3.默认的拷贝构造函数

MM(const MM& object) = default;

4.默认的赋值重载

MM& operator=(const MM& object) = default;

注意一般情况下,无需我们自己写析构函数。但如果我们做了内存申请,为了更好的内存管理就需要自己写析构函数。

三、代码详情

#include <iostream>
#include <string>
using namespace std;
class MM 
{
public:
	MM() = default;
	~MM() = default;
	MM(const MM& object) = default;
	MM& operator=(const MM& object) = default;
	//1.默认构造函数
	//2.默认析构函数
	//3.默认的拷贝构造函数
	//4.默认的赋值重载
private:
};
//重载中的特殊情况
//对象加常量的情况
class Test
{
public:
	Test(int num) :num(num) {}
	void printData() 
	{
		cout << num << endl;
	}
	//正常人处理方法
	//friend Test operator+(Test test, int data) 
	//{
	//	return Test(test.num + data);
	//}
	//friend Test operator+( int data, Test test)   
	//{
	//	return Test(test.num + data);
	//}
	Test operator+(Test test1)
	{
		return Test(this->num + test1.num);
	}

private:
	int num;
};

int main() 
{
	MM mm;
	MM result = mm;
	MM temp;
	temp = mm;
	Test object(1);
	object.printData();

	//不正常的重载只能用友元方式,才可以让下面都正确 
	//友元重载解析:operator+(1,object);  Test objec1=1
	Test res = object + 1;		//友元重载解析:operator+(object,1);
	res.printData();		
	//Test res2 = 1 + object;	//类成员函数重载会报错
	//res2.printData();

	return 0;
}

总结

友元函数在运算符重载时会用的比较多。知道类中有哪些默认的函数,就可以合理的省略一些不要的代码编程,提高了代码编程的效率(就是为了偷懒)

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 10:54:41  更:2022-09-13 10:58:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 12:53:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码