C++ 命名空间namespace的学习笔记

项目来源是研究安卓源码,需要底层对一些音频文件进行修改,涉及到知识盲区C ++,所以就了解了一些C ++ 的高级语法。
研究下来觉得挺有趣的,尤其是有关namespace这一部分,很重要也很实用,所以记录下来。

这里不是目录

  • using namespace std
  • 创建命名空间
    • 单文件创建
    • 多文件创建
  • Default Global Namespace
  • Using的用法
  • 命名空间的嵌套和别名

在C++中为了解决命名冲突的问题,引入了命名空间的概念。可以理解为C++的命名空间定义了一个 范围

using namespace std

一般只在主文件中(main.cpp)加入using namespace std,目的是将“std”中所包含的内容引入到当前命名空间。举个例子:

#include 
#include 
#include 
using namespace std;

int main(int argc, char *argv[])
{

    string word{"word"};
    cout << "word : " << word << endl;

    unique_ptr<int> number = make_unique<int>(12);
    cout << number.get() << endl;
    cout << *number << endl;
    cout << "----- yz ------" << endl;
    return 0;
}

输出结果:
在这里插入图片描述

在这里如果不加using namespace std 会报错,因为cout,endl是在std中定义的,如果将cout替换成std::cout, endl替换成std::endl,才可以使用,所以在开头加上using namespace std就是为了可以直接拿来用。
但是一般不建议在开头加上using namespace std,因为可能会造成很多麻烦,导致命名空间为污染。

创建命名空间

单文件创建

定义:namespace Number_Func{ … int(函数)…}
应用:Number_Func::函数名
例如:
命名空间定义一个函数:

namespace Number_Func
{
    int add(int a, int b)
    {
        return a + b;
    }
}

main里定义一个函数,同名的:

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

输出:

int a = 3, b = 4;
    cout << add(a, b) << endl;
    cout << Number_Func::add(a, b) << endl;

输出结果是7和8。

多文件创建

首先声明命名空间,注意不要在头文件中使用using ,创建函数时注意声明和定义分开。

number.h文件中定义一个函数和一个类

#ifndef NUMBER_H
#define NUMBER_H
#include 
namespace Math_Func
{
    int add(int a, int b);

    class Number
    {
    public:
        Number() = default;
        Number(double x);
        void info_number() const
        {
            std::cout << "Number : " << x << std::endl;
        }
        ~Number();

    private:
        double x{0.0};
    };
}

#endif

number.cpp

#include "number.h"
namespace Math_Func
{
    Number::Number(double x) : x(x) {}
    Number::~Number()
    {
    }
    int add(int a, int b)
    {
        return a + b;
    }
}

point.h再定义一个同名的函数和不同的类

#ifndef POINT_H
#define POINT_H
#include 
namespace Math_Func
{
    class Point
    {
    public:
        Point() = default;
        Point(double x, double y);
        void info_point() const
        {
            std::cout << "Point x: " << x << " y: " << y << std::endl;
        }
        ~Point();

    private:
        double x{0.0};
        double y{0.0};
    };
}
#endif

point.cpp

#include "point.h"

namespace Math_Func
{
    Point::Point(double x, double y) : x(x), y(y)
    {
    }
    Point::~Point() {}
}

注意看number.h和number.cpp,在.h文件的命名空间中声明了函数名,并定义了一个类,在.cpp文件中定义函数的实现。就是要做到函数的声明和定义分开。

main.cpp再定义一个命名空间和普通的函数

#include 
#include "point.h"
#include "number.h"
using namespace std;

namespace Number_Func
{
    int add(int a, int b)
    {
        return a + b;
    }
}

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

int main(int argc, char *argv[])
{
    int a = 3, b = 4;
    cout << add(a, b) << endl;
    cout << Number_Func::add(a, b) << endl;

    cout << "--- multiply file ---" << endl;
    Math_Func::Number n1;
    Math_Func::Number n2(1.3);
    n1.info_number();
    n2.info_number();
    Math_Func::Point p1;
    Math_Func::Point p2(1.3, 2.3);
    p1.info_point();
    p2.info_point();

    cout << Math_Func::add(a, b) << endl;

    cout << "----- yz ------" << endl;
    return 0;
}

输出结果如下:
C++ 命名空间namespace的学习笔记_第1张图片

Default Global Namespace

Default Global Namespace是默认全局命名空间,在其他的命名空间中,可以使用“::”来表示默认全局命名空间。
1.在外部声明并定义add函数:

int add(int a, int b);

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

2.在命名空间中可以用“ ::”来调用这一函数:

namespace Number_Func
{
    int add(int a, int b)
    {
        return a + b + 2;
    }
    int add_int(int a, int b)
    {
        return ::add(a, b) + 2;
    }
}

主函数:

    int a = 3, b = 4;
    cout << add(a, b) << endl;
    cout << Number_Func::add(a, b) << endl;
    cout << Number_Func::add_int(a, b) << endl;

最后打印结果就是8,9,10.

Using的用法

可以引入命名空间,也可以只引入一个类或者函数。

    {
        // 只引入函数
        using Number_Func::add_int;
        cout << add_int(a, b) << endl;
    }
    {
        // 只引入类
        using Math_Func::Number;
        Number n1;
        Number n2(1.2);
        n1.info_number();
        n2.info_number();
        Math_Func::Point p1;
    }
    {
        // 引入命名空间并解决冲突(全称)
        using namespace Math_Func;
        Number n1;
        Number n2(1.2);
        n1.info_number();
        n2.info_number();
        Point p1;
        Point p2(2.3, 4.5);
        p1.info_point();
        p2.info_point();
        cout << Math_Func::add(a, b) << endl;
    }

命名空间的嵌套和别名

C++支持命名空间别名,例如 namespace Some = Some1::Some2;
就是在namespace中再定义一个新的namespace;

namespace Number_Func
{
    int add(int a, int b)
    {
        return a + b + 1;
    }
    int add_int(int a, int b)
    {
        return ::add(a, b) + 2;
    }
    namespace Next_Number
    {
        int add(int a, int b)
        {
            return a + b + 10;
        }
    }
}
int main(int argc, char *argv[])
{
    int a = 3, b = 4;
    cout << Number_Func::Next_Number::add(a, b) << endl;//使用嵌套

    {
        namespace Data_Number = Number_Func::Next_Number;//别名
        cout << Data_Number::add(a, b) << endl;
    }

    cout << "----- yz ------" << endl;
    return 0;
}

输出结果就是两个17.

你可能感兴趣的:(C++学习,c++,学习,算法)