本期博客给大家带来的全是干货,慢慢享用吧~
C++入门主要是一些对C语言不足的语法补充,废话不多说直接上干货:
一、C++的输出和输入
1.1 输出
在C++上我们要想在屏幕(控制台)上进行一些内容的输出可以使用关键字:
cout
具体操作:cout << 想要输出的内容
❗注意:使用cout必须包含< iostream >头文件以及按命名空间使用方法使用std ❗注意:<<是流插入运算符
📋下面来进行使用举例:
从中我们可以看出cout可以自动识别类型(字符串、整型等等)
❗注意:endl在这里起到了换行的作用
1.2 输入
在C++上我们要想在标准输入对象(键盘)上进行一些内容的输入可以使用关键字:
cin
具体操作:cin >> 想要输出的内容
❗注意:使用cout必须包含< iostream >头文件以及按命名空间使用方法使用std
❗注意:<<是流插入运算符
下面来进行使用举例:
从中我们可以看出cin可以自动识别类型(字符串、整型等等)
二、缺省参数
2.1 缺省参数概念
📌缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。
📋下面来举个栗子
void Fun(int a = 0)
{
cout << a << endl;
}
int main()
{
Fun(); // 没有传参时,使用参数的默认值
Fun(1);// 传参时,使用指定的实参
Fun(68);// 传参时,使用指定的实参
}
运行结果
2.2 全缺省参数
📌全缺省参数顾名思义函数的参数全部都有缺省值
📋例如
void Fun(int a = 0, int b = 5, int c = 2)//函数参数全部都有缺省值
{
cout <<"a=" << a << endl;
cout <<"b=" << b << endl;
cout <<"c=" << c << endl;
}
运行结果:
根据运行结果,我们可以发现我们可以选择给部分参数传参
❗注意:但是传参时是按顺序一次给参数赋值,不可能跳过某个参数给其之后的参数传参(如上述例子就不可能发生只给a、c赋值不给b赋值的情况)
2.3 半(部分)缺省参数
📌半(部分)缺省参数顾名思义函数的部分参数没有有缺省值
📋举例举例
void Func(int a, int b = 10, int c = 20)//函数的部分参数没有有缺省值
{
cout << "a = " << a << endl;
cout << "b = " << b << endl;
cout << "c = " << c << endl;
cout << endl;
}
来看运行结果
❗注意:在定义部分缺省参数函数时,缺省参数必须从右往左依次来给出,不能间隔着给(按以上例子就不能出现a、c有缺省值,b没有缺省值的情况)
❗另外在最后要注意: 缺省参数不能在函数声明和定义中同时出现,要在声明中给出缺省值(如果生命与定义位置同时出现,恰巧两个位置提供的值不同,那编译器就无法确定到底该用那个缺省值)
三、函数重载
自然语言中,一个词可以有多重含义,人们可以通过上下文来判断该词真实的含义,即该词被重载了。比如:以前有一个笑话,国有两个体育项目大家根本不用看,也不用担心。一个是乒乓球,一个是男足。前者是“谁也赢不了!”,后者是“谁也赢不了!”
3.1 重载函数的概念
📌函数重载:是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(参数个数或类型或类型顺序)不同,常用来处理实现功能类似数据类型不同的问题。
📋下面来举个栗子
// 1、参数类型不同
int Add(int left, int right)
{
cout << "int Add(int left, int right)" << endl;
return left + right;
}
double Add(double left, double right)
{
cout << "double Add(double left, double right)" << endl;
return left + right;
}
// 2、参数个数不同
void f()
{
cout << "f()" << endl;
}
void f(int a)
{
cout << "f(int a)" << endl;
}
// 3、参数类型顺序不同
void func(int a, char b)
{
cout << "func(int a,char b)" << endl;
}
void func(char b, int a)
{
cout << "func(char b, int a)" << endl;
}
我们可以看到在此作用域内有add、f和func三个名字的六个函数,仔细观察可以发现add的两个函数的参数类型不同、f的两个函数参数个数不同、func的两个函数参数类型书顺序不同。这三种情况在C++中是可以存在的,并且能根据调用函数所给参数的区别很好来识别函数进行编译运行:
那就会存在一个问题,既然需要来识别参数类型来调用相对应的函数那会不会比C语言慢呢?
💡答案是会的,但是慢的是编译速度而不是运行速度(C++在编译时就要进行对函数参数类型的识别了)
3.2 C++支持函数重载的原理--名字修饰(name Mangling)
为什么C++支持函数重载,而C语言不支持函数重载呢?
这是因为C++和C语言在编译时对函数的处理不同。
📋下面来进行举例:
由于Windows下vs的修饰规则过于复杂,而Linux下g++的修饰规则简单易懂,下面我们使 用了g++演示了这个修饰后的名字:
采用C语言编译器编译后结果:
采用C++编译器编译后结果:
对比一下两种结果我们可以看出gcc的函数修饰后名字不变。而g++的函数修饰后变成【_Z+函数长度 +函数名+类型首字母】。
💡下面可以得出结论:在linux下,采用g++编译完成后,函数名字的修饰发生改变,编译器将函数参 数类型信息添加到修改后的名字中,而添加的这些信息就可以很好支持函数重载。
本期博客到这又要结束了,下期会继续对C++入门知识的讲解
敬请期待~