友元和优化

2023-09-21 11:40:57

目录

友元函数:

 友元函数不能用const修饰

友元函数可以在类定义的任意位置声明:

 友元类

内部类(了解)

匿名对象:

 ​编辑

编译器优化:

优化场景1

优化场景2:

 无法优化的场景:

优化场景3

优化场景4:

 


友元函数:

 友元函数不能用const修饰

原因:友元函数并不是类的成员函数,类的成员函数中有this指针,this指针才需要被const修饰。

友元函数可以在类定义的任意位置声明:

 

 友元类

class Time
{
	friend class Date; 
public:
	Time(int hour=0, int minute=0, int second=0)
		: _hour(hour)
		, _minute(minute)
		, _second(second)
	{

	}
private:
	int _hour;
	int _minute;
	int _second;
};
class Date
{
public:
	Date(int year = 1900, int month = 1, int day = 1)
		: _year(year)
		, _month(month)
		, _day(day)
	{
	}
	void SetTimeDate(int hour, int minute, int second)
	{
		_t._hour = hour;
		_t._minute = minute;
		_t._second = second;
	}
private:
	int _year;
	int _month;
	int _day;
	Time _t;
};

表示Date是Time的友元类,我们在类Time中可以访问Date类的私有的成员变量和共有的成员函数。

内部类(了解)

 

匿名对象:

class A
{
public:
	A(int a = 1)
		:_a(a)
	{
		cout << "构造函数" << endl;
	}
	~A()
	{
		_a = 0;
		cout << "析构函数" << endl;
	}
private:
	int _a;
};
int main()
{
	//A aa1(1);   //构造
	//A aa2 = 2;   //构造+拷贝构造
	/*A aa3();*/    //错误  无法区分函数声明和创建对象
	A();
	A(3);
	return 0; 
}

 

匿名对象会调用并且匿名对象的作用域是所定义的这一行。

class Solution {
public:
	int Sum_Solution(int n) {
		return n;
	}
};
int main()
{
	//A aa1(1);   //构造
	//A aa2 = 2;   //构造+拷贝构造
	/*A aa3();*/    //错误  无法区分函数声明和创建对象
	/*A();
	A(3);*/
	int ret=Solution().Sum_Solution;
	return 0; 
}

匿名对象的作用是我们不需要创建类对象就可以调用成员函数。

并且我们在传递返回值时也可以使用匿名对象:

A F()
{
	return A(10);
}

等价于构造加上返回。

编译器优化:

优化场景1

class A
{
public:
	A(int a = 0)
		:_a(a)
	{
		cout << "构造函数" << endl;
	}
	A(const A&aa)
		:_a(aa._a)
	{
		cout << "拷贝构造" << endl;
	}
	A&operator=(const A&aa)
	{
		cout << "赋值重载" << endl;
		if (this != &aa)
		{
			_a = aa._a;
		}
		return *this;
	}
	~A()
	{
		_a = 0;
		cout << "析构函数" << endl;
	}
private:
	int _a;
};
int main()
{
	A aa1 = 1;//构造+拷贝构造直接优化为构造
}

优化场景2:

int main()
{
	//A aa1 = 1;//构造+拷贝构造直接优化为构造
	A aa1;
	f1(aa1);//构造+拷贝构造
}

优化:

void f1(A aa)
{

}
int main()
{
	//A aa1 = 1;//构造+拷贝构造直接优化为构造
	//A aa1;
	//f1(aa1);//构造+拷贝构造
	f1(A(1));
}

直接优化成构造函数。

 无法优化的场景:

void f1(const A& aa)
{

}
int main()
{
	//A aa1 = 1;//构造+拷贝构造直接优化为构造
	//A aa1;
	//f1(aa1);//构造+拷贝构造
	f1(A(1));
}

匿名对象具有常性,所以用const修饰,传引用传参不会发生拷贝构造,所以只有一个构造:

优化场景3

A f()
{
	A aa;
	return aa;
}
int main()
{
	//A aa1 = 1;//构造+拷贝构造直接优化为构造
	//A aa1;
	//f1(aa1);//构造+拷贝构造
	//f1(A(1));
	A ret=f();//构造+拷贝构造+拷贝构造
}

构造+拷贝构造+拷贝构造优化为构造+拷贝构造。

 

 

 

这样写无法优化,这里是赋值。

 

优化场景4:

 

A f()
{
	return A(3);
}
int main()
{
	//A aa1 = 1;//构造+拷贝构造直接优化为构造
	//A aa1;
	//f1(aa1);//构造+拷贝构造
	//f1(A(1)); 
	//A ret;//构造+拷贝构造+拷贝构造
	//ret = f();
	A ret = f();
}

直接构造:

 

如何触发编译器优化?

答:能用匿名对象就用匿名对象。

更多推荐

pytorch学习1

前言王者之争核心之争在于动态图优先还是静态图优先pytorch是动态计算生成新变量tf是先定义变量,再生成回归问题1、梯度下降算法了解[梯度算法是深度学习的核心,deeplearning求解复杂问题主要靠的是梯度下降算法,故deeplearning近似等于gradientprograming.]类似于高中所学的求导问题

Python 文件介绍和正则表达式

文章目录Python文件和正则表达式文件打开文件读取文件直接读取read():逐行读取采用**for**循环:采用readlines():正则表达式匹配规则re模块match方法:search方法group方法split方法编译:compile方法Python文件和正则表达式文件打开文件open函数用来打开文件,常用模

5个小功能掌握正则表达式的使用

点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~这篇文章通过实现5个小功能,来讲述在Java中如何使用正则。Java中如何使用正则Java中正则相关类位于java.util.regex包下,主要使用2个类,如下:Pattern类:Pattern是正则表达式regex的编译表示形式Mat

手机上免费更改地址大全

大家好!今天我要分享一篇关于在手机上如何更改地址的文章。在互联网时代,地址是我们在网络世界中的身份标识,而更改地址可以为我们带来诸多便利。掌接下来,就让我们一起来了解手机上如何更改地址的全面指南吧!1.使用虚拟专用网络(虚拟私人网络)虚拟专用网络是一个常用并且有效的方法,可以帮助您更改手机上的地址。通过连接到虚拟专用网

xss渗透(跨站脚本攻击)

一、什么是XSS?XSS全称是CrossSiteScripting即跨站脚本,当目标网站目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就发生了。这里我们主要注意四点:1、目标网站目标用户;2、浏览器;3、不被预期;4、脚本。二、XSS有什么危害?当我们知道了什么是XSS后,也一定很想知

【Linux基础命令】nmtui命令使用实战

前言linux常用命令专栏已进入尾声,大约90个命令是日常工作中常用的,在拓展一些不常用的,也就100左右。是不是总结下来后,就感觉要学的内容没有那么多了。当然有些专属的基础命令不在本专栏内,比如LVM管理命令,RAID管理命令。后面还会继续添加一些shell中常用的命令。文章目录前言一.nmcui的介绍二.语法格式及

shared_ptr用法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、初步了解二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,

高精度PWM脉宽调制信号转模拟信号隔离变送器1Hz~10KHz转0-5V/0-10V/1-5V/0-10mA/0-20mA/4-20mA

主要特性:>>精度等级:0.1级。产品出厂前已检验校正,用户可以直接使用>>辅助电源:8-32V宽范围供电>>PWM脉宽调制信号输入:1Hz~10KHz>>输出标准信号:0-5V/0-10V/1-5V,0-10mA/0-20mA/4-20mA等,具有高负载能力>>全量程范围内极高的线性度(非线性度<0.2%)>>标准D

数据结构——图的应用

文章目录前言一、图的应用1.最小生成树普里姆(Prim)算法克鲁斯卡尔(Kruskal)算法2.最短路径Dijkstra算法求单源最短路径3.拓扑结构4.关键路径总结前言图的应用1.1最小生成树1.2最短路径1.3拓扑结构1.4关键路径一、图的应用1.最小生成树定义:从图中选取若干条边,将所有顶点连接起来,并且所选取的

LLM 09-新的模型架构

LLM09-新的模型架构回想一下第6章模型架构,神经语言模型的核心接口是一个将token序列映射到上下文嵌入的编码器:[the,mouse,ate,the,cheese]⇒ϕ[(10.1),(01),(11),(1−0.1),(0−1)].[\text{the},\text{mouse},\text{ate},\tex

51单片机光照强度检测自动路灯开关仿真( proteus仿真+程序+报告+讲解视频)

51单片机光照强度检测自动路灯开关仿真(proteus仿真+程序+报告+讲解视频)仿真图proteus7.8及以上程序编译器:keil4/keil5编程语言:C语言设计编号:S0052讲解视频基于51单片机的光照检测自动路灯控制仿真设计(proteus仿真+程序+报告+讲解视频)1.主要功能:基于51单片机的万年历时钟

热文推荐