函数的重载
在C语言中函数名是唯一的,不可以重复定义,当我们利用函数执行,功能相似的函数,我们也不能使用同一个函数,比如说,求整型的函数,不能用来求浮点型、字符型。在C++中引入函数重载的概念,函数名可以相同,只要函数的参数类型不同或者参数的个数不同。
#include <iostream>
using namespace std;
int mymax(int a, int b)
{
return a > b ? a : b;
}
float mymax(float a, float b)
{
return a > b ? a : b;
}
double mymax(double a, double b)
{
return a > b ? a : b;
}
char mymax(char a,char b)
{
return a > b ? a : b;
}
int main()
{
cout << mymax(10, 20) << endl;
cout << mymax(3.14, 5.20) << endl;
cout << mymax(2.33333333, 5.555555) << endl;
cout << mymax('a', 'A') << endl;
return 0;
}
在C++中支持函数的重载,允许函数名相同,只需要函数参数的类型不相同或参数的个数不同。它优于C语言的是我们不需要大量记忆功能相同的函数名。比如上面的求最大值的函数,我们只需要记忆mymax是求最大值的函数,如果是C语言我们就需要记忆4个函数名,因为C语言不支持函数的重载,函数名不可以相同。
作用域运算符::
我们在C语言中已经知道了变量的作用域范围
当一个局部和全局变量同时存在的时候,我们优先使用局部变量,那我们又想使用全局变量怎么办,我们加作用域运算符就可以优先使用全局变量了。
#include <iostream>
using namespace std;
int a = 100;
int main()
{
int a = 10;
cout << "a=" << a << endl;
cout << "::a=" << ::a << endl;
return 0;
}
强制类型转换
在C语言中我们也学过强制类型转换,C++也可以使用C语言的强制类型转换,在C++引入新的强制转换的方法就是为了,更加的方便
#include <iostream>
using namespace std;
int main()
{
float f = 3.14;
cout << (int)f << endl;//C语言的写法
cout << int(f) << endl;//C++的写法
return 0;
}
C++的强制类型转换与C语言的强制类型转换的不同就在,C语言是把要强制类型转换的类型加括号,C++的写法是将我们要强制转换的数据变量括起来。
#include <iostream>
using namespace std;
int main()
{
float f = 3.14;
int a = (int)f + 0.9;
int b = int(f + 0.9);
int c = (int)(f + 0.9);
cout << "a=" << a << " " << "b=" << b << " " << "c=" << c << endl;
return 0;
}
如果我们要强制类型转换f+0.9,在C语言需要两个括号,而C++只需要一个括号。
运算符new和delete
C语言中我们使用malloc,realloc来申请动态的内存空间,在C++中我们使用new来申请空间
C语言使用free释放内存空间,而C++使用delete来释放空间
我们先写一个程序看看new和delete是怎么使用的
#include <iostream>
using namespace std;
int main()
{
int* p = new int;//公式: 指针变量名=new 类型名。 该行代码的作用是申请一个整型空间,然后这个整型空间的地址存在p指针中
*p = 100;
cout << *p << endl;
delete p;//释放申请的整型空间,防止内存泄露
return 0;
}
那么我们假如要申请很多个整型空间怎么做呢
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
int* p = new int[10];//向内存申请10个整型空间,首地址给p 公式:指针变量名=new 类型名[size] size是申请的个数
if (p == NULL)//判断是否申请空间成功
{
perror("new:");//打印错误信息
return 1;//结束程序
}
for (int i = 0; i < 10; i++)//输入10个元素
{
cin >> p[i];
}
for (int i = 0; i < 10; i++)//输出
{
cout<< p[i]<<" ";
}
delete []p;//释放我们数组的空间 公式: delete [] 指针变量名
return 0;
}
#include <iostream>
using namespace std;
int main()
{
int* p = new int(100);//申请一个整型空间,并且将100赋值给*p
cout << *p << endl;
delete p;
return 0;
}
C语言的动态内存申请,malloc、realloc申请成功返回的是void*的指针,我们还需要进行类型转换。而new开辟的内存空间成功返回的直接是首地址,不需要强制类型转换,malloc也需要进行字节大小的计算,所以,C++中new申请动态内存空间更加便利。
引用
引用简单的说就是绰号,就是一个变量的别名。
从图中也可以发现,引用用的ta等价于a,改变ta也会改变a
我们定义引用名时要立马指定我们要引用谁,不然会报错。
引用可以作为函数的参数
在C语言的时候我们就知道了,函数形参是实参的一份临时的拷贝,如果我们要修改实参的元素,我们需要传地址。
eg:交换两个数字
上面的方法是我们C语言的时候学习的,传数据的地址过去,利用指针接受,解引用如何访问a,b数据的空间
在我们C++中,我们可以利用引用的操作,这个做法更加简单。
C++中避免了,书写多个*,我们利用int& x,int& y,接收a,b。
x就是a的引用,它们共用同一块空间,修改x相当于修改a
使用引用返回函数值
我们通常知道,一个函数会返回一个类型,我们不能对调用函数的语句进行什么操作,在C++的引用中,如果将函数的返回值引用,我们就可以对返回值进行操作,从而对内容修改,我们看实际的例子。
我们加了引用,Change(4)相当于a[4],我们可以对其修改,如果不加会报错