C++---------命名空间、函数重载、缺省参数

C++&C的对比

我觉得C++是一门很有意思的学科,现在自己只是一个初学者的阶段,在这里我将主要针对C和C++的不同做一些总结。
C几乎是C++的一个子集,所以C语言支持的语法在C++上基本上都支持的,并需要使用使用,C plus plus(C++),所以在C的基础上又增加了许多的特性。
这里写图片描述
所以我用更通俗的话来说就是在C++中,C语言的知识仍然是适用的。

数据类型

这里写图片描述

内置类型:C++中这些基本的数据类型称为内置类型,也就是语言内部已经定义的基本类型。
自定义类型:自己用struct/class/enum/union等定义的等都是自定义类型。

命名空间

命名空间域随着标准C++而引入的,它相当于一个更加灵活的文件域(全局域),可以用花括号把文件括起来,并以关键字namespace开头给它起一个名字。

#include <iostream>
namespace name
{
    int a = 2;
}

int main()
{
    std::cout << a << std::endl;
    system("pause");
}

我们运行之后,发现程序不能正常的通过,并不能指定是哪个命名空间的变量,所以编译器找不到这个变量。

其中命名空间可以解决变量冲突的问题,当出现局部变量和全局变量的时候,局部变量要优先被访问,局部变量优先被访问,同时命令空间的格式如同下面的代码。

namespace name1
{
    int a = 2;
}
namespace name2
{
    int a = 3;
}
int main()
{
    int a = 4;
    std::cout << a << std::endl;
    std::cout << name1::a << std::endl;
    std::cout << name2::a << std::endl;
    system("pause");
}

我们可以看到输出的结果为:
这里写图片描述
从这里我们可以看到的是我们在main函数中指定了一个变量a,输出的时候如果不指定命名空间就会直接输出a,这是因为C语言的就近原则,编译器找到了一个最近的局部变量a,就不会去其他的地方进行寻找。
第二个我们可以看到输出的是2,这是因为指定的命名空间是name1,所以编译器会去该空间进行寻找。结果3依然如此。
所以我们换句话说,命名空间就是为了解决命名冲突问题。

在C++写代码的时候我们总会写入下面的一段代码

using namespace std

在C++程序中常有的是这个写法,其实namespace是指标识符的各种可见的范围。C++标准程序库中的所有标识符都是定义在一个名为std的namespace中。
using namespace std这个是说从源程序的这个地方开始,可以使用命名空间std中的名称。如cout的全名就是std::cout。你在前面如果加了using namespace std后就可以直接使用cout来代替std::cout,否则就必须用其全名std::cout来表示。

实现一个简单的C++程序

#include <iostream>//IO流
using namespace std;//命名空间
int main()
{

    std::cout << "hello world" << std::endl;//std::endl表示的是换行符,
    //::作用域解析符
    system("pause");
}
  • 其中 #include < iostream.h > VC6.0依旧支持的是这个头文件,新的编译器就不再支持了,建议我们现在使用的都是新库的头文件# include < iostream >
  • cout是标准输出流对象,<<是输出操作符
  • cin是标准输入流对象,>>是输入操作符
  • endl是换行操作符
  • 它们都是属于C++标准库的,所以都在std的名字空间里面。

C语言的格式控制输出不同的格式,C++可以吗,怎么做的?

#include <iostream>
using namespace std;//命名空间
int main()
{
    int i1 = 1;
    double d1 = 2.22;
    cout << "C++ type:" << "int ->" << i1 << "double->" << d1 << endl;
    cout << "please input int and double";
    cin >> i1 >> d1;
    cout << "C++ type:" << "int ->" << i1 << "double->" << d1 << endl;
    //std::endl表示的是换行符,
    //::作用域解析符
    system("pause");
}

运行结果:
这里写图片描述
我们可以看到的是在C++中默认的输入的小数的位数只会保留5位。它不区分数据的类型。我们要向输出精确的数据的小数点后面的位数,就要使用到的函数就是setprecision。

我们可以看下面的实现到的过程

#include<iomanip>
#include <iostream>
using namespace std;//命名空间
int main()
{
    int i1 = 1;
    double d1 = 2.22;
    cout << "C++ type:" << "int ->" << i1 << "double->" << d1 << endl;
    cout << "please input int and double";
    cin >> i1 >> d1;
    cout << setprecision(9);
    cout << "C++ type:" << "int ->" << i1 << "double->" << d1 << endl;
    system("pause");
}

运行的结果如下所示
这里写图片描述

我们看到的是使用固定的位数显示的时候最后一位会进行四舍五入计算的。

缺省参数

全缺省参数

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

半缺省参数

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

注意半缺省只能从右往左进行缺省

函数重载

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

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

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

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

函数重载的规则

  • 函数名称必须相同。
  • 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。
  • 函数的返回类型可以相同也可以不相同。
  • 仅仅返回类型不同不足以成为函数的重载。

注意:在linux下我们可以用objdump

  • -d 反汇编
  • -ld 反汇编时显示文件名跟行号

猜你喜欢

转载自blog.csdn.net/daboluo521/article/details/80908483