一、运算符重载相关知识点补充
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
}
运行结果: