C++回顾day01---<命名空间>

一:namespace是指标识符的各种控件范围(类java中package)

C++语言引入命名空间(Namespace)这一概念主要是为了避免命名冲突,其关键字为 namespace

二:iostream.h和iostream(体现命名空间优点)

#include <iostream>  //标准库放在std命名空间中,所以使用的时候使用using namespace std;
#include <iostream.h>
这是两个不同的文件,在早期使用带.h(将标准库功能定义在全局空间里,容易和开发人员的类或者方法重名冲突<因为标准库太庞大>),
后面为了将c++和c区分,并且为了正确使用命名空间,就不带.h(可以很好的解决上面问题)
实际上为了区分C和C++,C++规定头文件不使用后缀.h

三:使用方法(三种)<例std>

(一)直接使用指定标准库

std::cout << "use namespace std" << std::endl;
缺点:使用麻烦,需要一个个引入
优点:减少冲突

(二)使用using关键字,和(一)类似,只是提前声明

using std::cout;
using std::endl;

cout << "use namespace std" << endl;

(三)使用using namespace std;将所有的标识符曝光,就像是全局变量一样使用(最常用)

using namespace std;

cout << "use namespace std" << endl;

四:自定义namespace使用《重点》

注意点一:命名空间需要写在头文件,方便引入

namesp.h
#ifndef NAME_SPACE_H
#define NAME_SPACE_H

#include <iostream>

using namespace std;

namespace NameSpA
{
    class getInfo
    {
    public:
        virtual double getG() = 0;
        virtual double getA() = 0;
    };

    class Circle : public getInfo
    {
    private:
        const double PI = 3.1415;
        int r;    //C不存在设置默认值
        double g;
        double a;

        int c = 10;
        int b = c * 2;

    public:

        Circle(int r)
        {
            this->r = r;

            cout << "radius:" << r << endl;
            cout << "girth:" << g << endl;
            cout << "area:" << a << endl;

            cout << "b:" << b << endl;
        }

        double getG()
        {
            this->g = 2 * PI*r;
            cout << "girth:" << g << endl;
            return g;
        }

        double getA()
        {
            this->a = PI*r*r;
            cout << "area:" << a << endl;
            return a;
        }
    };

}

#endif

注意点二:使用命名空间是需要先引入该头文件

#include "namesp.h"

using namespace NameSpA;  //可以使用

void main(int argc, char* argv[])    //第一个是参数数量,第二个是参数
{
    cout << argc << endl;

    cout << "use namespace std" << endl;

    if (argc <= 1)
        return;

    cout << argv[0] << endl;
    cout << argv[1] << endl;

    int r = atoi(argv[1]);
    cout << r << endl;;

    getInfo* gi = new Circle(r);    //一般设计内存就使用指针
    gi->getA();
    gi->getG();

    system("pause");
    return;
}

五:总结(结合C)

(一)c中命名空间

在C语言中只有一个全局作用域
C语言中所有的全局标识符共享一个作用域
标识符之间可能发生冲突

(二)C++命名空间

命名空间将全局作用域分成不同的部分
不同命名空间中标识符可以同名而不会发生冲突
命名空间可以嵌套
全局作用域叫做默认命名空间(直接使用即可,也可以::变量)

六:补充嵌套命名空间

头文件:namesp.h

namespace OutNP
{
    int a = 0;

    namespace InnerNP
    {
        int a = 1;
    }
}

cpp文件使用(一)简单演示

#include "namesp.h"

using namespace OutNP;

void main(int argc, char* argv[])    //第一个是参数数量,第二个是参数
{
    cout << a;    //0

    system("pause");
    return;
}

cpp文件使用(二)有冲突

 

cpp文件使用(三)无冲突

#include "namesp.h"

using namespace OutNP;
using namespace OutNP::InnerNP;    //这样还是存在命名冲突

void main(int argc, char* argv[])    //第一个是参数数量,第二个是参数
{
    cout << OutNP::a;    //0
    cout << InnerNP::a;    //1

    system("pause");
    return;
}
posted @ 2019-03-29 20:24  山上有风景  阅读(234)  评论(0编辑  收藏  举报