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

}

运行结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值