当前位置: 首页 > news >正文

C++8 -- 运算符重载相关知识点补充

一、运算符重载相关知识点补充

1、调用拷贝构造函数的三种情况:

1)用一个旧对象去构造一个新对象;
2)函数返回是类类型的值值类型,即值返回;
3)函数传参;

2、c = a + b; -理解

	int a = 10, b = 3;
	int c = 0;
	c = a + b;

这句话的意思:从a的内存空间把a的值取出来,从b的内存空间把b的值取出来,然后把两个值进行相加,将相加后的值将其放在左边,写入c的内存空间

3、a + b = c;//error 理解

这句话的意思为:将c的值从其确定的内存单元中取出来,放入到左边(将a的值将其确定的内存单元中取出来,将b的值从其确定的内存单元中取出来,然后将这两个值进行相加,生成一个没有确定内存单元的临时值),将a的值写入到这个临时值当中,
临时空间只能进行临时存放,不能最终结果存放
在这里插入图片描述

3、A operator++(int) 的int使用

对于b++,
c++规定,在后++的时候,参数里面写个int,这个int没有实际作用,只是为了区分前++

A operator++(int) //b++,c++规定,在后++的时候,参数里面写个int,这个int没有实际作用,只是为了区分前++
	{
		/*int t = m_i;  //先保存以前的值
		m_i = m_i + 1; //自己本身加1
		return t;     //返回没加以前保存的值*/
		return m_i++;
	}

4、函数sort

调用类库里的一个函数,头文件为#include

其有三个参数

sort(first,last,op);  //op -- 为操作,默认为重新到大<,less<int>()
//op可以传普通函数,也可传函数对象

基础调用

#include <algorithm>
void main()
{
	//假设要对这段元素进行排序
	int a[] = {12,5,36,2,5,48,12,33,21,10,5,9,7};
	int n = sizeof(a) / sizeof(a[0]);
	//这里调用类库里的一个函数sort,头文件为#include <algorithm>
	sort(a,a + n);//不写第三个参数为默认,默认是从小到大,等价与sort(a, a + n,less<int>());
	//sort(a, a + n,less<int>());
	//sort(a, a + n, greater<int>());//从大到小
	int i;
	for(i = 0;i < n;i++)
		cout << a[i] << " ";
	cout << endl;

}

运行结果:

在这里插入图片描述

自己设计普通函数:

int My_Great(int x,int y) //普通函数
{
	return x > y;
}
int My_Small(int x,int y)
{
	return x < y;
}

void main()
{
	//假设要对这段元素进行排序
	int a[] = {12,5,36,2,5,48,12,33,21,10,5,9,7};
	int n = sizeof(a) / sizeof(a[0]);
	//这里调用类库里的一个函数sort,头文件为#include <algorithm>

	//sort(a,a + n);//默认是从小到大
	//sort(a,a + n,less<int>);//从小到大排序 <>为模板,是一个类模板 less是stl标准库库文件里的一个类
	//sort(a,a + n,greater<int>{});

	sort(a,a + n,My_Great);
	//sort(a,a + n,My_Small);
	
	int i;
	for(i = 0;i < n;i++)
		cout << a[i] << " ";
	cout << endl;

}

运行 sort(a,a + n,My_Great);

在这里插入图片描述
运行 sort(a,a + n,My_Small);

在这里插入图片描述
对于sort(a,a + n,My_Great);
My_Great 为函数名,代表函数的入口地址,
sort(first,last,op); 中的op为操作,要求我们填是操作,可以的普通函数,也可以是函数对象。
这里的My_Great为普通函数。普通函数直接写函数名就行了。

5、模板 – <>

sort(a, a + n,less<int>());
sort(a, a + n, greater<int>());

其中 greater 和 less 是个库(stl标准模板库)内定义的一个类。这两个其实为仿函数,或者叫函数对象,即把对象当作函数来使用。
暂时可理解为,对于sort(a, a + n, greater()); 即有<>,其为模板,是个类模板,其中为int,说明greater里面是操作int类型的。

6、函数指针(大概描述)

函数名代表函数的入口地址
在定义指针变量的时候,需要定义基类型(是这个指针变量所指向的变量的类型)
定义方式为: 基类型 *指针变量名

函数指针和指针函数:

函数指针 — 指向函数的指针:

int (*p)(int ,int);//定义了一个函数指针 -- 指向函数的指针
//函数名为(*p),返回值为int,函数参数类型为两个int
//解读:首先p是一个指针,这个指针指向一个(),说明其指向的是一个函数,函数返回值是int,里面有两个int类型的参数

指针函数 – 返回值为指针的函数:

int* q(int ,int ); //指针函数 -- 返回值为指针的函数

在这里插入图片描述
在这里插入图片描述

使用示例:

这里设计两个简单的函数

int max(int a,int b)
{
	return  a > b ? a:b;
}
int sum(int a,int b)
{
	return a + b; 
}

这两个函数的类型是一样的,

对其进行调用:

int main()
{
	int (*p)(int,int);//定义了一个函数,返回值为int,里面有两个int类型的参数  //函数指针 -- 指向函数的指针
	//int* q(int ,int ); //指针函数 -- 返回值为指针的函数
	p = sum;
	cout << p(5,9) << endl; //调用的是sum(5,9)
	p = max;
	cout << p(3,7) << endl; //调用的是max(3,7)
	
}

运行结果:

在这里插入图片描述

函数指针作为参数

函数指针作为参数
使用示例:

void test(int a,int b,int (*p)(int ,int)) //这里p = sum  
{
	cout << p(a,b) << endl; //sun(a,b) sum(12,30)
}

示例代码:

int max(int a,int b)
{
	return  a > b ? a:b;
}
int sum(int a,int b)
{
	return a + b; 
}

//函数名代表函数的人口地址
//基类型 *指针变量名

void test(int a,int b,int (*p)(int ,int)) //p = sum  //函数指针作为参数
{
	cout << p(a,b) << endl; //sun(a,b) sum(12,30)
}

int main()
{
	test(12,30,sum);  //sum不需要带() ,将函数名当中参数来使用
}

运行结果:
在这里插入图片描述

测试代码:

int max(int a,int b)
{
	return  a > b ? a:b;
}
int sum(int a,int b)
{
	return a + b; 
}

//函数名代表函数的人口地址
//基类型 *指针变量名

void test(int a,int b,int (*p)(int ,int)) //p = sum  //函数指针作为参数,需要
{
	cout << p(a,b) << endl; //sun(a,b) sum(12,30)
}

int main()
{
	//int (*p)(int,int);//定义了一个函数,返回值为int,里面有两个int类型的参数  //函数指针 -- 指向函数的指针
	//int* q(int ,int ); //指针函数 -- 返回值为指针的函数
	/*
	p = sum;
	cout << p(5,9) << endl; //调用的是sum(5,9)
	p = max;
	cout << p(3,7) << endl; //调用的是max(3,7)
	*/

	test(12,30,sum);  //sum不需要带()
}

7、sizeof是个运算符

注意会变蓝的
在这里插入图片描述

void main()
{
	//\012为一个字符
	//\0 后面如果跟着数字,为8进制的字符
	char str[] = "abc\012abcdef"; //a b c \n a b c d e f \0
	char str1[] = "abcdef";
	char str2[] = "abc\0abc"; //sizeof(str2) -- 8  strlen(str2) -- 3

	cout << sizeof(str) << endl; //11
	cout << strlen(str) << endl; //10
	cout << sizeof(str1) << endl; //7
	cout << strlen(str1) << endl; //6
	cout << sizeof(str2) << endl; //8
	cout << strlen(str2) << endl; //3 -- 遇到\0结束,所以是3

}

运行结果:

在这里插入图片描述

相关文章:

  • UNet详细解读(一)论文技术要点归纳
  • 【Linux】指令及权限管理的学习总结
  • 物通博联“5G+IIOT”构建污水处理物联网,助力远程监控智慧管理
  • 【Node.JS】事件的绑定与触发
  • 【微服务】微服务万字实战,带你了解工程原理
  • MySQL面试50题【mysql】
  • 【消息中间件】RocketMQ设计浅析
  • C语言学习完后,C++与Java我应该怎么选择
  • SpringCloud Bus消息总线
  • 图形学-反走样/抗锯齿
  • 2.1.5操作系统之线程概念与多线程模型
  • Spring中的AOP概念介绍使用、AOP相关术语、切入点表达式(面向切面编程上篇)
  • heic图片转换
  • 数据分析 | Pandas 200道练习题,每日10道题,学完必成大神(2)
  • 2017年某高校848数据结构真题复习
  • 【Amaple教程】5. 插件
  • 【EOS】Cleos基础
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • gf框架之分页模块(五) - 自定义分页
  • isset在php5.6-和php7.0+的一些差异
  • Java新版本的开发已正式进入轨道,版本号18.3
  • JWT究竟是什么呢?
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Python十分钟制作属于你自己的个性logo
  • SOFAMosn配置模型
  • TypeScript实现数据结构(一)栈,队列,链表
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 聊聊hikari连接池的leakDetectionThreshold
  • 山寨一个 Promise
  • 什么是Javascript函数节流?
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • #Lua:Lua调用C++生成的DLL库
  • #Spring-boot高级
  • $.proxy和$.extend
  • (JS基础)String 类型
  • (笔试题)合法字符串
  • (二)WCF的Binding模型
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (三)模仿学习-Action数据的模仿
  • (转)树状数组
  • .net framework profiles /.net framework 配置
  • .net6+aspose.words导出word并转pdf
  • .net打印*三角形
  • .NET框架设计—常被忽视的C#设计技巧
  • .Net中ListT 泛型转成DataTable、DataSet
  • @RequestMapping处理请求异常
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • []C/C++读取串口接收到的数据程序
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [20180224]expdp query 写法问题.txt
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [Android View] 可绘制形状 (Shape Xml)
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)