当前位置:   article > 正文

C++-基础概念-命名空间-缺省参数-函数重载_c++ stl缺省参数

c++ stl缺省参数

1. C++版本变更

版本更新内容
C++98C++第一个版本,绝大多数编译器都支持,以模板方式重写C++标准库,引入STL (标准模板库)
C++03C++标准第二个版本,语言特征无大改变,主要:修订错误,减少多异性
C++05C++保准委员会发布了一份计数报告
C++11增加了许多特性,使得C++更像是一种 新语言,例如:正则表达式,基于范围for循环,auto关键字,新容器,列表初始化,二进制字面常量等
C++14对C++的扩展,主要是修复C++11中漏洞以及改进
C++17在C++11上做了一些小幅改进,增加了19个新特性
C++20制定ing

2. C++关键字(C++98)

C++总计63个关键字,C语言32个关键字

asmdoifreturntrycontinue
autodoubleinlineshorttypedeffor
booldynamic_castintsignedtypeidpublic
breakelselongsizeoftypenamethrow
caseenummutablestaticunionwchar_t
catchexplicitnamespacestatic_castunsigneddefault
charexportnewstructusingfriend
classexternoperatorswitchvirtualregister
constfalseprivatetemplatevoidtrue
const_castfloatprotectedthisvolatilewhile
deletegotoreinterpret_cast

3. 命名空间

  使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或者名字污染,namespace关键字就是解决这个问题的。

3.1 命名空间定义

  1.普通的命名空间,命名空间中的内容,既可以定义变量,也可以定义函数
  2.命名空间可以嵌套
  3.同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间
  4.一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中

namespace N
{
	int a;
	int b;
	int Add(int left, int right)
	{
		return left + right;
	}
	namespace N1
	{
		int c;
		int d;
		int Sub(int left, int right)
		{
			return left - right;
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

3.2 命名空间的使用

三种方法:
  1.加命名空间名称及作用域限定符

int main()
{
	printf("%d\n", N::a);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5

  2.使用using将命名空间中成员引入

using N::b;

int main()
{
	printf("%d\n", N::a);
	printf("%d\n", b);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

  3.使用using namespace命名空间名称引入

using N::b;
using namespace N;
using namespace N1;

int main()
{
	printf("%d\n", N::a);
	printf("%d\n", b);
	printf("%d\n", c);
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4. C++输入&输出

#include <iostream>
using namespace std;

int main()
{
	int a;
	cin >> a;
	cout << a << endl;
	cout << "Hello World" << endl;
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

5. 缺省参数

  当函数声明或者定义函数的时候,我们可以给函数的参数一个默认值,当函数调用的时候,如果没有指定该函数的参数,那么函数调用默认使用默认参数。缺省参数分类:全缺省参数和半缺省参数。
注意:
  1.半缺省参数必须从右往左依次来给出,不能间隔
  2.缺省参数不能在声明和定义中同时出现,因此声明和定义最好不要分开写
  3.缺省的值必须是常量或者全局变量
  4.C语言不支持

int fun(int a = 10, int b = 20)
{
	return a + b;
}

int main()
{
	cout << fun() << endl;
	cout << fun(1,2) << endl;

	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

6. 函数重载

6.1 函数重载概念

  C++中允许在同一个作用域中声明几个功能类似的同名函数,同名函数的形参列表是不同的(参数个数或者类型或者顺序不同)

int fun(int a = 10, int b = 20)
{
	return a + b;
}

double fun(double a, double b)
{
	return a + b;
}

double fun(int a, double b)
{
	return a + b;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

下面这个不属于函数重载

short Add(short left, short right)
{
	return left + right;
}

int Add(short left, short right)
{
	return left + right;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

面试题:
  为啥什么上面这个两个函数不能函数重载?为什么C++支持函数重载,而C语言不支持函数重载?

在这里插入图片描述
  在C/C++中,一个程序要运行起来需要预处理,编译,汇编,链接。在C语言中函数最后会转化成为_fun,而在C++中,函数会根据参数的多少,顺序,类型的不同来产生不同的函数名,因此是可以根据这些信息对同名函数进行区分。然而在linux下,采用gcc编译完成后,函数名称的修饰没有发生改变。

6.2 Windows下名字修饰规则

函数签名修饰后名称
int func(int)?fun@@YAHH@Z
float func(float)?fun@@YAMM@Z
int C::func(int)?fun@C@@AAEHH@Z
int C::C2::func(int)?fun@C2@C@@AAEHH@Z
int N::func(int)?func@N@@YAHH@Z
int N::C::func(int)?func@C@N@@AAEHH@Z

6.3 extern “C”

  在C++工程中某些函数可能需要按照C的风格来编译,同过关键字extern,意思告诉编译器该函数按照C语言规则来编译

extern short Add(short left, short right)
{
	return left + right;
}
  • 1
  • 2
  • 3
  • 4

面试题:
下面两个函数能形成函数重载吗?会出现什么问题?

void TestFunc(int a = 10)
{
	cout << "void TestFunc(int)" << endl;
}
void TestFunc(int a)
{
	cout << "void TestFunc(int)" << endl;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

  不能,默认值不同但是函数在进行编译链接的时候函数的名字是一样的,计算机会不知道调用哪个,存在二义性。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/548197
推荐阅读
相关标签
  

闽ICP备14008679号