精华内容
下载资源
问答
  • C++--名字空间定义

    2019-11-04 17:02:54
    C++提供了一种称为**名字空间(namespace)**的机制,...例如,我们尝试利用自己定义的"My_code"名字空间进行试验: namespace My_code{ //定义My_code名字空间 class complex{/*...*/}; complex sqrt(complex); ...

    C++提供了一种称为**名字空间(namespace)**的机制,一方面表达某些声明是属于一个整体,另一方面表明它们的名字不会与其他名字空间中的名字冲突。
    例如,我们尝试利用自己定义的"My_code"名字空间进行试验:

    namespace My_code{     //定义My_code名字空间
    	class complex{/*...*/};
    	complex sqrt(complex);
    	//...
    	int main();
    }
    int My_code::main(){  //这个main()函数隶属于上面自己定义的My_code名字空间的main()函数,
    	complex z{1,2};
    	auto z2 = sqrt(z);
    	std::cout<<'{'<<z2.real()<<','<<z2.image()<<"}\n";
    	//...
    }
    int main(){//这个main()函数不是My_code名字空间的main()函数,只是全局名字空间中的函数。
    	return My_code::main(); //这句代码表示回调My_code名字空间的main()函数,
    }
    

    通过将代码放在名字空间My_code中,就可以确保我们的名字不会和名字空间std中的标准库名字冲突。因为标准库确实支持complex算术运算,所以提前设置这样的预防措施是好的。
    要想访问其他名字空间中的某个名字,最简单的方法是在这个名字前加上名字空间的名字作为限定 ( 例如std:cout 和 My code:main)。 “真正的 main() ”定义在全局名字空间中,换句话说,它不属于任何自定义名字空间、类或函数。要想获取标准库名字空间中名字的访问权,我们应该使用using指示:
    using namespace std;
    名字空间主要用于组织较大规模的程序组件,最典型的例子是库。使用名字空间,我们就可以很容易地把若干独立开发的部件组织成一个程序。

    展开全文
  •  定义名字空间中的实体称为名字空间的成员。  名字空间内的名字可以被该名字空间内的其他成员直接访问,名字空间外的代码必须指定该名字位于哪个名字空间。  一个名字空间可以包含多种类型的标识符,如下面...
  • 名字空间含义及作用

    千次阅读 2006-05-29 08:36:00
    名字空间是为了防止名字污染在标准 C++ 中引入的。它可以将其中定义的...}在应用的时候 使用这些数据和函数名称太麻烦给定义在同一德的名字空间内不用繁琐的去重新书写和定义名字空间就可以了我觉得有点像类 又有

    名字空间是为了防止名字污染在标准 C++ 中引入的。
    它可以将其中定义的名字隐藏起来,不同的名字空间中可以有相同的名字而互不干扰,使用时用域操作符(::)来引用。
    namespace 名字
    {
       定义的数据;
       定义的函数;
       也可以是定义的类。。。。。。


    }

    在应用的时候 使用这些数据和函数名称太麻烦
    给定义在同一德的名字空间内
    不用繁琐的去重新书写和定义
    用名字空间就可以了
    我觉得有点像类  又有点像 头文件 

    使用方法有以下三种:
    1> using namespace sdm;
    然后你就可以使用变量temp:
    temp=9;
    还可以使用sdm中的其他每一个成员。
    2>using sdm::temp;
    在这个文件中只能使用sdm中的temp这个变量。
    3>你在使用时直接使用sdm::temp:
    cout<<sdm::temp<<endl;
    使用其它的成员也这样调用。

     
    Top
     
     回复人: oyxiaoyu0(小雨仔) ( ) 信誉:100  2002-08-19 11:07:15Z  得分:0 
     
     
    ?
    可以参考以下资料!


    --------------------------------------------------------------------------------
     


    条款28: 划分全局名字空间

    全局空间最大的问题在于它本身仅有一个。在大的软件项目中,经常会有不少人把他们定义的名字都放在这个单一的空间中,从而不可避免地导致名字冲突。例如,假设library1.h定义了一些常量,其中包括:

    const double lib_version = 1.204;

    类似的,library2.h也定义了:

    const int lib_version = 3;

    很显然,如果某个程序想同时包含library1.h和library2.h就会有问题。对于这类问题,你除了嘴里骂几句,或给作者发报复性邮件,或自己编辑头文件来消除名字冲突外,也没其它什么办法。

    但是,作为程序员,你可以尽力使自己写的程序库不给别人带来这些问题。例如,可以预先想一些不大可能造成冲突的某种前缀,加在每个全局符号前。当然得承认,这样组合起来的标识符看起来不是那么令人舒服。

    另一个比较好的方法是使用c++ namespace。namespace本质上和使用前缀的方法一样,只不过避免了别人总是看到前缀而已。所以,不要这么做:

    const double sdmbook_version = 2.0;      // 在这个程序库中,
                                             // 每个符号以"sdm"开头
    class sdmhandle { ... };                

    sdmhandle& sdmgethandle();             // 为什么函数要这样声明?
                                           // 参见条款47

    而要这么做:

    namespace sdm {
      const double book_version = 2.0;
      class handle { ... };
      handle& gethandle();
    }

    用户于是可以通过三种方法来访问这一名字空间里的符号:将名字空间中的所有符号全部引入到某一用户空间;将部分符号引入到某一用户空间;或通过修饰符显式地一次性使用某个符号:

    void f1()
    {
      using namespace sdm;           // 使得sdm中的所有符号不用加
                                     // 修饰符就可以使用

      cout << book_version;          // 解释为sdm::book_version
      ...

      handle h = gethandle();        // handle解释为sdm::handle,
                                     // gethandle解释为sdm::gethandle
      ...                           

    }

    void f2()
    {
      using sdm::book_version;        // 使得仅book_version不用加
                                     // 修饰符就可以使用

      cout << book_version;           // 解释为
                                      // sdm::book_version
      ...

      handle h = gethandle();         // 错误! handle和gethandle
                                      // 都没有引入到本空间
      ...                            

    }

    void f3()
    {
      cout << sdm::book_version;      // 使得book_version
                                      // 在本语句有效
      ...                            

      double d = book_version;        // 错误! book_version
                                      // 不在本空间

      handle h = gethandle();         // 错误! handle和gethandle
                                      // 都没有引入到本空间
      ...                           

    }

    (有些名字空间没有名字。这种没命名的名字空间一般用于限制名字空间内部元素的可见性。详见条款m31。)

    名字空间带来的最大的好处之一在于:潜在的二义不会造成错误(参见条款26)。所以,从多个不同的名字空间引入同一个符号名不会造成冲突(假如确实真的从不使用这个符号的话)。例如,除了名字空间sdm外,假如还要用到下面这个名字空间:

    namespace acmewindowsystem {

      ...

      typedef int handle;

      ...

    }

    只要不引用符号handle,使用sdm和acmewindowsystem时就不会有冲突。假如真的要引用,可以明确地指明是哪个名字空间的handle:

    void f()
    {
      using namespace sdm;                 // 引入sdm里的所有符号
      using namespace acmewindowsystem;    // 引入acme里的所有符号

      ...                                  // 自由地引用sdm
                                           // 和acme里除handle之外
                                           // 的其它符号

      handle h;                            // 错误! 哪个handle?

      sdm::handle h1;                      // 正确, 没有二义

      acmewindowsystem::handle h2;         // 也没有二义

      ...

    }

    假如用常规的基于头文件的方法来做,只是简单地包含sdm.h和acme.h,这样的话,由于handle有多个定义,编译将不能通过。

    名字空间的概念加入到c++标准的时间相对较晚,所以有些人会认为它不太重要,可有可无。但这种想法是错误的,因为c++标准库(参见条款49)里几乎所有的东西都存在于名字空间std之中。这可能令你不以为然,但它却以一种直接的方式影响到你:这就是为什么c++提供了那些看起来很有趣的、没有扩展名的头文件,如<iostream>, <string>等。详细介绍参见条款49。

    由于名字空间的概念引入的时间相对较晚,有些编译器可能不支持。就算是这样,那也没理由污染全局名字空间,因为可以用struct来近似实现namespace。可以这样做:先创建一个结构用以保存全局符号名,然后将这些全局符号名作为静态成员放入结构中:

    // 用于模拟名字空间的一个结构的定义
    struct sdm {
      static const double book_version;
      class handle { ... };
      static handle& gethandle();
    };

    const double sdm::book_version = 2.0;      // 静态成员的定义

    现在,如果有人想访问这些全局符号名,只用简单地在它们前面加上结构名作为前缀:

    void f()
    {
      cout << sdm::book_version;

      ...

      sdm::handle h = sdm::gethandle();

      ...
    }

    但是,如果全局范围内实际上没有名字冲突,用户就会觉得加修饰符麻烦而多余。幸运的是,还是有办法来让用户选择使用它们或忽略它们。

    对于类型名,可以用类型定义(typedef)来显式地去掉空间引用。例如,假设结构s(模拟的名字空间)内有个类型名t,可以这样用typedef来使得t成为s::t的同义词:

    typedef sdm::handle handle;

    对于结构中的每个(静态)对象x,可以提供一个(全局)引用x,并初始化为s::x:

    const double& book_version = sdm::book_version;

    老实说,如果读了条款47,你就会不喜欢定义一个象book_version这样的非局部静态对象。(你就会用条款47中所介绍的函数来取代这样的对象)

    处理函数的方法和处理对象一样,但要注意,即使定义函数的引用是合法的,但代码的维护者会更喜欢你使用函数指针:

    sdm::handle& (* const gethandle)() =      // gethandle是指向sdm::gethandle
      sdm::gethandle;                         // 的const 指针 (见条款21)

    注意gethandle是一个常指针。因为你当然不想让你的用户将它指向别的什么东西,而不是sdm::gethandle,对不对?

    (如果真想知道怎么定义一个函数的引用,看看下面:

    sdm::handle& (&gethandle)() =      // gethandle是指向
      sdm::gethandle;                  // sdm::gethandle的引用

    我个人认为这样的做法也很好,但你可能以前从没见到过。除了初始化的方式外,函数的引用和函数的常指针在行为上完全相同,只是函数指针更易于理解。)

    有了上面的类型定义和引用,那些不会遭遇全局名字冲突的用户就会使用没有修饰符的类型和对象名;相反,那些有全局名字冲突的用户就会忽略类型和引用的定义,代之以带修饰符的符号名。还要注意的是,不是所有用户都想使用这种简写名,所以要把类型定义和引用放在一个单独的头文件中,不要把它和(模拟namespace的)结构的定义混在一起。

    struct是namespace的很好的近似,但实际上还是相差很远。它在很多方面很欠缺,其中很明显的一点是对运算符的处理。如果运算符被定义为结构的静态成员,它就只能通过函数调用来使用,而不能象常规的运算符所设计的那样,可以通过自然的中缀语法来使用:

    // 定义一个模拟名字空间的结构,结构内部包含widgets的类型
    // 和函数。widgets对象支持operator+进行加法运算
    struct widgets {
      class widget { ... };


      // 参见条款21:为什么返回const
      static const widget operator+(const widget& lhs,
                                    const widget& rhs);

      ...

    };

    // 为上面所述的widge和operator+
    // 建立全局(无修饰符的)名称

    typedef widgets::widget widget;


    const widget (* const operator+)(const widget&,        // 错误!
                                     const widget&);       // operator+不能是指针名
     

    widget w1, w2, sum;

    sum = w1 + w2;                           // 错误! 本空间没有声明
                                             // 参数为widgets 的operator+

    sum = widgets::operator+(w1, w2);        // 合法, 但不是
                                             // "自然"的语法

    正因为这些限制,所以一旦编译器支持,就要尽早使用真正的名字空间。

     

    展开全文
  • 解释名字空间

    千次阅读 2014-03-12 20:56:39
    简单地说,名字空间namespace,是指标识符的各种可见范围。在写大程序时,不同程序员在使用标识符时,可能出现名字重叠冲突现象,为此C++中引入名字空间概念,将相同我名字放入不同的名字空中,就可以避免相同的名字...

           简单地说,名字空间namespace,是指标识符的各种可见范围。在写大程序时,不同程序员在使用标识符时,可能出现名字重叠冲突现象,为此C++中引入名字空间概念,将相同的名字放入不同的名字空间中,就可以避免相同的名字的冲突。

            举一个例子,我们两个班在上课,在每班各有一个学生叫李刚。为了防止名字冲突,在叫李刚时前面加上班级,这个班级就是名字空间。

           由于C++标准程序库中的所有标识符都被定义于一个名为std的namespace中,所以我们在程序前面要加上使用它的语句:using namespace std;

         一 名字空间有三种使用方法(参照课本P12)

        1. using namespace std---这种方法,在后面没有特别声明均表示名字来自空间std;

        2.使用“::”域运算符。

            空间名::名字,如std::cout<<"hello!"--表明此处使用的标识符cout来自名字空间std;  

       3.使用using和域运算符

           如using std::cout<<"Hello!";

        二  名字空间还可以自己定义

          定义关健词:namesapce

          语法:namesapce 空间名

         例如:

    #include<iostream>  
    using   namespace   std;  //使用标准命名空间
      
    namespace   namespace1  //自己定义第一个命名空间
      {         
        int a=100;
      }  
    
     namespace  namespace2 //自己定义第二一个命名空间
     {  
    	 int a=200;
     }  
    
      void   main()  
      {  int a=300;
          cout<<"nameapce1:a="<<namespace1::a<<endl;
          cout<<"nameapce2:a="<<namespace2::a<<endl;
          cout<<“main:a="<<a<<endl;
      }  
    

    上例中,变量a定义过两次,重叠使用了,但不会出错,分别输出各自的值。如果不是在不同的名字空间里,编译是通过不了的。

      三.还可以嵌套定义名安空间

       例:

    namespace   HelloWorld  
      {  
            namespace   Hello  
             {  
                void   foo()
    	     {   cout<<"Hello";   }  
             }  
            void   fooo()
    	     {   Hello::foo(); 
    	         cout<<"   World!"<<endl;    }  
      }  
    
      void   main()  
      {  
          HelloWorld::fooo();  
      } 
    


    注:初学者,可以不用自己定义名字空间,只要明白名字空间含义及为什么使用std标准空间就行了。

     

     

    展开全文
  • 第2天:什么是名字空间作者:阿捷 2004-6-24 20:58:04DOCTYPE声明好以后,接下来的代码是: 通常我们HTML4.0的代码只是,这里的"xmlns"是什么呢?这个"xmlns"是XHTML namespace的缩写,叫做"名字空间"声明。名字空间...
    第2天:什么是名字空间
    作者:阿捷 2004-6-24 20:58:04

    DOCTYPE声明好以后,接下来的代码是:

    <html xmlns="http://www.w3.org/1999/xhtml" lang="gb2312">

    通常我们HTML4.0的代码只是<html>,这里的"xmlns"是什么呢?

    这个"xmlns"是XHTML namespace的缩写,叫做"名字空间"声明。名字空间是什么作用呢?阿捷自己的理解是:

    由于xml允许你自己定义自己的标识,你定义的标识和其他人定义的标识有可能相同,但表示不同的意义。当文件交换或者共享的时候就容易产生错误。为了避免这种错误发生,XML采用名字空间声明,允许你通过一个网址指向来识别你的标识。例如:

    小王和小李都定义了一个<book>标识,如果小王的名字空间是"http://www.xiaowang.com",小李的名字空间是"http://www.xiaoli.com",那么当两个文档交换数据时,也不会混淆<book>标识,因为它属于不同的名字空间。

    更通俗的解释是:名字空间就是给文档做一个标记,告诉别人,这个文档是属于谁的。只不过这个"谁"用了一个网址来代替。

    XHTML是HTML向XML过渡的标识语言,它需要符合XML文档规则,因此也需要定义名字空间。又因为XHTML1.0不能自定义标识,所以它的名字空间都相同,就是"http://www.w3.org/1999/xhtml"。如果你还不太理解也不要紧,目前阶段我们只要照抄代码就可以了。

    后面的lang="gb2312",指定你的文档用简体中文。

    <<<上一节 第1天:选择什么样的DOCTYPE  下一节第3天:定义语言编码 >>>

    TOP
    展开全文
  • 名字空间

    2007-03-12 11:44:00
    名字空间定义 名字空间是一个作用域,其形式以关键字namespace开始,后接名字空间的名字,然后一对大括号内写上名字空间的内容。例如: namespace test { class Foo { // ... }; Foo operator+ (const Foo&, ...
  • C++——名字空间

    2014-01-05 20:15:31
    一、名字空间定义 namespace fmp {  int num;  void f();  //… … }   二、名字空间的使用 ① 直接使用  fmp::num = 78;  fmp::f(90);   ② 使用using 声明  using fmp:
  • c++的名字空间

    千次阅读 2014-04-14 21:39:42
    1.在c++中, 名称可以是变量、函数、结构体、枚举、类以及类和结构体的成员。当项目越来越大时,名称相互冲突的可能性也将增加。使用多个厂商的类库时,可能...2.一个名字空间中的名称不会与另外一个名字空间中的相同
  • 一、什么是名字空间? C++中对函数、变量、类型进行逻辑上的划分,避免同名的标识符重定义。 当我们在处理非常庞大复杂的项目时,不可避免地需要多人共同合作,可是人一多,取出来的名字难免重复,于是就会发生重...
  • C++ 名字空间详解

    千次阅读 2015-08-29 18:45:25
    名字空间的由来名字空间(namespace)是由标准C++引入的,是一种新的作用域级别。原来C++标识符的作用域分为三级:代码块({…}和函数体)、类域和全局作用域。如今,在类作用域和全局作用域之间,C++标准又添加了...
  • 一个标识符可在多个名字空间定义,它在不同名字空间中的含义是互不相干的。这样,在一个新的名字空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他名字空间中。 其实这个...
  • C++名字空间详解

    千次阅读 2018-04-25 14:41:32
    1.名字空间的由来名字空间(namespace)是由标准C++引入的,是一种新的作用域级别。原来C++标识符的作用域分为三级:代码块({…}和函数体)、类域和全局作用域。如今,在类作用域和全局作用域之间,C++标准又添加...
  • 匿名名字空间

    千次阅读 2009-10-16 10:08:00
    通常,利用定义名字空间的办法,可以使模块划分更加方便,减少模块间的相互影响。通常定义一个名为MyNameSpace的名字空间,其形式为: 1 namespace MyNameSpace 2 { 3 } static修饰,在处理函
  • DOCTYPE声明好以后,接下来的代码是: http://www.w3.org/1999/xhtml" lang="gb2312">   通常我们HTML4.0的代码...名字空间什么作用呢?阿捷自己的理解是: 由于xml允许你自己定义自己的标识,你定义的标识和其
  • 定义含义:所谓定义,就是创建(编译器)一个对象,为这个对象分配一块内存空间并取名,也就是我们平常所说的变量名或对象名,一旦这个名字和这块内存空间匹配, 那么在定义的这个对象或变量的生命周期中,所...
  • C++之名字空间与类

    千次阅读 2018-08-16 18:54:00
     定义名字空间的方式 namespace name {  ... }  名字空间的合并  同名的名字空间会自动合并  在同一个名字空间中的标识符必须是唯一的  定义与声明分开  即在名字空间中声明函数 namespace nam...
  • 名字空间定义 名字空间使用 头源分离 同一命名空间在多个文件中  一般自己是不会使用的,但一些大型的库可能用到,比如命名空间std. 名字空间定义 解决名字冲突问题的究极解决方法:namespace(名字空间) ...
  • 定义含义:所谓定义,就是创建(编译器)一个对象,为这个对象分配一块内存空间并取名,也就是我们平常所说的变量名或对象名,一旦这个名字和这块内存空间匹配,那么在定义的这个对象或变量的生命周期中,所创建的这...
  • C++ 60分钟入门教程 - 3、C++名字空间

    千次阅读 2014-10-19 23:13:04
    名字空间的定义 名字空间除了系统定义的名字空间之外,还可以自己定义,定义名字空间用关键字“namespace”,使用名字空间时用符号“::”指定。...名字空间定义和使用举例: #include using namespace std;namesp
  • 名字空间 探讨!

    2010-05-04 10:27:00
    名字空间定义一个“用于声明的区域”。在C++程序设计环境中,变量、函数、类的名字曾经有过爆炸性的增长,在使用名字空间之前,所有这些名字都是在全局名字空间中,从而导致了大量的名字冲突。例如:如果你在程序中...
  • C++匿名名字空间

    千次阅读 2013-05-27 10:49:55
    名字空间(namespace),是C++提供的一个解决符合名字冲突的特性。标准规定,在不同名字空间中命名相同...通常,利用定义名字空间的办法,可以使模块划分更加方便,减少模块间的相互影响。 通常定义一个名为MyNameSpace
  • 玩转C++名字空间

    2012-08-21 08:32:35
    一、概要 名字空间是一种描述逻辑分组的机制。也就是说,如果有一些声明按照某种准则在逻辑上属于同一个集团...PS:只有名字空间的声明定义与函数的定义后是不用分号;的,其余的都是要带分号的。 二、使用声明和使用
  • 1.创建名字空间 直接在.h文件中输入 namespace WorkStation { namespace Trade { } } 这样就会创建名字空间了。 相应的在左侧的“类视图”中,就会看到该名字空间。 2. 将一个类添加到一个名字空间中。 直接在该...
  • 名字空间作用域:就是程序员利用名字空间定义在C++程序中划分出来的一块比较大的程序区段。在该程序区段内部,可以定义类型,函数,模版,变量。名字空间作用域可以跨越多个*.cpp文件而存在。在名字空间作用域内部还...
  • namespace名字空间小解

    千次阅读 2006-08-11 15:57:00
    大家都知道,当我们定义了一个类,而声明对象的时候就要用到 class_name 后跟对象名称,标准名字空间也是这个用法。 其实,我们可以按照一个更为抽象包含更广的类来理解标准名字空间。#include中的iostream正是包含...
  • 在开始之前,先了解一个内置函数dir(),它可以帮助我们分析一些内部的东西,dir()的描述是:dir(): 函数不带参数时,返回当前范围内的...简单来说,不带参数时,会返回当前名字空间的内容(通常是locals名字空间)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 483,082
精华内容 193,232
关键字:

名字空间的定义是什么