C++:命名空间,函数重载与缺省参数

本篇博客主要针对与c与c++不同的地方做以总结。

C++:在C的基础上添加了一些新的特性
C++的学习主要分为以下几个大的板块。
- c
- 类 & 对象
- 继承 & 多态
- 模板 & 泛型编程
- 异常处理
- C++库 & STL

也就是说,之前我们所学过的c语言的所有知识在c++中仍然适用。

数据类型

  1. 内置类型
  2. 自定义类型:struct/class/enum/union

命名空间

命名空间域是随c++标准引入的,相当于一个更加灵活的文件域,可以用花括号把文件的一部分括起来,并以关键字namespace开头给它起一个名字。

namespace name1
{
    int a=10;
}
int main()
{
    std::cout<<a<<std::endl;
}
//这段代码是编不过去的,原因是:
//a变量并没有指定是哪个命名空间的变量。所以编译器找不到这个变量。

再来看下面这个例子:

namespace name1
{
    int a=10;
}
namespace name2
{
    int a=20;
}
int main()
{
    int a=30;
    std::cout<<a<<std::endl;
    std::cout<<name1::a<<std::endl;
    std::cout<<name2::a<<std::endl;
}
//结果:
//30
//10
//20

可以看到,我们在main函数中定义了一个局部变量a,输出时不指定命名空间就会输出该变量a,这是源于c语言中的就近原则,编译器向上找到了一个最近的局部变量a,就不会去别的地方找,直接输出。
第二个输出10,原因是指定了命名空间name1,所以编译器会在该命名空间内找该变量a,name2同理。

也就是说,命名空间的意义实际上是为了防止命名冲突的。

那么我们经常写c++代码时,会写一句:

using namespace std; 

这是为什么?
原因是由于:标准c++库中的所有组件都是在一个被称为std的名字空间中声明和定义的。因此,只要使用c++库中的组件,只要写一个using namespace std即可。或者使用std::成员的方式来使用。这句话的实际意思是,将std的命名空间展开到全局域上,所以在你的代码任何地方都可以使用该命名空间中的组件,但是,尤为重要的一点,一旦你将该命名空间展开为全局域之后,变量的命名就不能够与std中的标识符重名。
如下面的代码:

using namespace std;
int main()
{
    int max=10;
    std::cout<<max(1,2)<<std::endl;
}
//显然这两个max的含义不同,第一个max是我自己定义的变量,第二个max是std库里的函数名。

输入输出

cout是标准输出流对象,<< 是输出操作符

cin是标准输入流对象,>>是输入操作符

都属于C++标准库,所以都在std的名字空间里面。

格式控制输出流,不如使用c语言输出更加直观

实例:

cout<<"hello world!"<<endl;
cin>>num;

缺省参数

全缺省参数

int add(int a=0,int b=0)
{
    return a+b;
}

半缺省参数:只能缺省右边的值

int add(int a,int b=0)
{
    return a+b;
}

注意:缺省只能从右向左缺省。

*函数重载**

在同一作用域类,一组函数的函数名相同,参数列表不同

“不同” 可以是:参数个数不同/参数类型不同/返回值可同可不同

实例:以下函数均构成函数重载。

int Add(int a)
{
    return a+10;
}
int Add(int a,int b)
{
    return a+b;
}
int Add(char ch1,char ch2)
{
    return ch1+ch2;
}
int Add(int a,char ch2)
{
    return a+ch2;
}
int Add(char ch1,int b)
{
    return ch1+b;
}

​c++是如何支持重载的?

这是由于c++函数名称修饰规则。我在Linux下使用objdump工具可以查看到函数名称修饰的区别。
这里写图片描述
可以看到c++在函数名称修饰上会在该名称前加上前缀与后缀,但是,后缀很明显加入了该函数每个参数类型的首字母。

猜你喜欢

转载自blog.csdn.net/mxrrr_sunshine/article/details/80810623