精华内容
下载资源
问答
  • 若给命名空间、文件、函数的作用域排个大小应该是: 命名空间>>文件>函数 命令空间可以包含多个文件多个 一个也可以包含多个文件,一个分布多个文件 函数只能一...

    若给命名空间、类、文件、函数的作用域排个大小应该是:

    全局>命名空间>类>文件>函数

    一个文件可以包含多个命名空间,一个命名空间也可以分布在多个文件中
    1)名字空间名称相同,成员名字不同,那么他们会自动合并为一个名字空间,可以理解为追加
    2)名字空间名称相同,成员名称相同。那么程序会在调试过程的link时报错。因为连接器会检测到重复定义的变量。
    3) C++的命名空间可以在源文件中,也可以在头文件中。
    4)C++的命名空间和类拆分到多个文件时,不需要像C# 拆分同一个类分成多个文件时使用partial class

    fileA.h
    namespace study
    {
    }
    
    fileB.h
    namespace study
    {
    }
    

    一个类也可以包含多个文件,一个类分布在多个文件中

    函数只能在一个文件中

    命令空间、类的作用域是从逻辑上讲的,文件是物理上的

    展开全文
  • 一个程序中,一般是命名空间包含类,类中包含函数,函数是某个功能的实现,而头文件是函数的声明,库是一些标准函数(我们经常重复使用的函数)的实现,所以一个c++程序中,头文件就是用来对所用到的函数进行...

    几个基本概念之间的联系:

    在一个程序中,一般是命名空间包含类,类中包含函数,函数是某个功能的实现,而头文件是函数的声明,库是一些标准函数(我们经常重复使用的函数)的实现,所以在一个c++程序中,头文件就是用来对所用到的函数进行声明的。在新的C++标准中,标准库文件(函数的实现)和我们写的程序开头include的头文件(函数的声明)都是包含在命名空间std中,所以要使用头文件中声明的函数的话,还应该:using namespace std;详见CPPP P697;


    命名空间的概念:

    命名空间内部不仅可以声明或定义变量,对于其它能在命名空间以外声明或定义的名称,同样也都能在命名空间内部进行声明或定义,例如类、函数(包括定义和实现)、typedef、#define 等都可以出现在命名空间中。 C++ 引入了命名空间的概念,计划重新编写库,将类、函数、宏等都统一纳入一个命名空间,这个命名空间的名字就是std。std 是 standard 的缩写,意思是“标准命名空间”。

    在编译器的安装目录的include文件夹,你能够看到写程序经常用到的iostream,cstdio等头文件,以iostream为例,其内容如下:

    #ifndef _GLIBCXX_IOSTREAM
    #define _GLIBCXX_IOSTREAM 1
    
    #pragma GCC system_header
    
    #include <bits/c++config.h>
    #include <ostream>
    #include <istream>
    
    namespace std 
    {
      /**
       *  @name Standard Stream Objects
       *
       *  The <iostream> header declares the eight <em>standard stream
       *  objects</em>.  For other declarations, see
       *  http://gcc.gnu.org/onlinedocs/libstdc++/27_io/howto.html#10 and the
       *  @link s27_2_iosfwd I/O forward declarations @endlink
       *
       *  They are required by default to cooperate with the global C library's
       *  @c FILE streams, and to be available during program startup and
       *  termination.  For more information, see the HOWTO linked to above.
      */
      //@{
      extern istream cin;		///< Linked to standard input
      extern ostream cout;		///< Linked to standard output
      extern ostream cerr;		///< Linked to standard error (unbuffered)
      extern ostream clog;		///< Linked to standard error (buffered)
    
    #ifdef _GLIBCXX_USE_WCHAR_T
      extern wistream wcin;		///< Linked to standard input
      extern wostream wcout;	///< Linked to standard output
      extern wostream wcerr;	///< Linked to standard error (unbuffered)
      extern wostream wclog;	///< Linked to standard error (buffered)
    #endif
      //@}
    
      // For construction of filebuffers for cout, cin, cerr, clog et. al.
      static ios_base::Init __ioinit;
    } // namespace std
    
    #endif /* _GLIBCXX_IOSTREAM */

    从上面可以清楚的看到,这个头文件的内容都包含在std这个命名空间之中,当然std命名空间不止包含这些内容,因为命名空间是可以不连续的,所以一些常用的.h文件的内容基本结构都和iostream一样:先打开namespace std{...},然后在这个命名空间中增加内容。


    iostream和iostream.h的区别:

    <iostream>和<iostream.h>不一样,表面上就能看到前者没有后缀。实际上,在编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里。c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不再使用后缀.h。因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用using namespace std;这样才能正确使用cout。


    编译器是如何根据头文件的内容找到对应的实现文件的? 

           我们通常把类的定义都放在头文件,而其成员函数以及静态成员变量的定义都放在一个主名相同,扩展名不同的cpp文件——这只是一种风格和传统,而不是C++语言规定的。你也可以把一个类的10个函数分别在10个不同的cpp文件中实现,甚至有4个实现在cpp文件中,另外3个是打包在以前做好的静态库(.lib)中,还有3个内联定义在头文件中——都没问题。只要每个cpp文件都能顺利通过编译,而且链接器在链接时都能找到这些定义就OK了。详细来讲:

           首先编译器是不管头文件的,头文件只是用来被cpp文件包含的,被包含之后,它就成了那个cpp文件的一部分了,而编译器只编译.cpp文件,不会去单独编译一个头文件的。编译器不会查找“确定”的实现文件。它只是编译每个cpp文件,每个cpp文件,把所有包含的东西展开后,其内容都不能自相矛盾(比如类A并没有一个名叫f的方法,后面却用到了这个方法),否则编译根本就通不过。——编译器这样做之后,一般生成 .obj(VC), .o(unix)

           然后连接器把所有这些obj文件连接成一个程序,或者是exe或dll(或做成静态的lib)。如果在连接的过程中,有些实体(比如变量或函数)找不到定义,则会报link错误。或者某个函数f在不同的cpp文件中出现了多次定义,而且都是外连接,那连接器也会报重复定义地错误。

           更加深入的理解那就是:编译器只是负责检查函数的声明,并生成一个假设的函数定义地址的引用,而链接器负责把这个假设的引用指向真实的函数地址。换句话说:编译的时候不需要找对应的库文件,链接时才需要。其实链接的时候它也不找,而是采取如下的办法:

    1、 把所有需要的库中的符号都载入内存(这里需要的库是工程里设置好的,而不是根据头文件变化而变化的)
    2、 链接时如果需要一个函数,链接程序会到步骤1中的符号表中找,并进行定位。
    所以无论在哪个库文件中,只要你在工程中指定它为需要的库,则链接程序都会载入它的符号到符号表。要找到需要的函数,不需要知道它在哪个库文件中,只要符号表有即可。

    linux中关于库和头文件的使用详见博文:Linux编译多个不同目录下的文件以及静态库、动态库的使用


    附录:

    .dll文件:

           dll(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即dll文件,放置于系统中。当我们执行某一个程序时,相应的dll文件就会被调用。一个应用程序可使用多个dll文件,一个dll文件也可能被不同的应用程序使用,这样的dll文件被称为共享dll文件。

    .lib文件:

           静态编译:将导出声明和实现都放在lib中,编译后所有代码都嵌入到宿主程序,所以链接好了之后,lib文件就没有用了;

    动态编译:一般的动态库程序有lib文件(这个lib文件和上面静态编译的lib文件不同)和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。此时lib文件一般是一些索引信息,相当于一个C语言中的h文件,编译后只是将函数地址存在宿主程序中,而函数的具体实现在dll文件中,运行到调用函数是调用dll并载入函数来实现函数的具体操作。


    .dll和.lib都是windows中的文件格式。linux中对应的文件格式是 .so和 .a




    展开全文
  • 我小白摸不着头脑,自己印象命名空间是个很大的范围,而且我写的这段应该是属于“方法”。 然后花一个下午时间自己查… 终于查到问题,原来是打多了一个" } ",我吐了,又是低级错误。直接导致“方法”写到...

    命名空间不能直接包含字段或方法之类的成员
    明明和教程里的一模一样啊…一直显示这里是报错。
    我小白摸不着头脑,在自己印象中,命名空间是个很大的范围,而且我写的这段应该是属于“方法”。
    然后花一个下午时间自己查…
    终于查到问题,原来是打多了一个" } ",我吐了,又是低级错误。直接导致“方法”写到外面去了…
    就像Q:C#命名空间不能直接包含字段或方法之类的成员

    [c#]命名空间不能直接包括字段或方法

    展开全文
  • 表达式-命名空间

    2009-03-06 19:21:00
    在继续学习之前,应该了解另一个比较重要的主题——命名空间。它们是.NET提供应用程序代码容器的方式,这样就可以唯一...这表示对于包含在这段代码的项,只要按照名称进行引用,就可以由全局命名空间中的其他代...

        在继续学习之前,应该了解另一个比较重要的主题——命名空间。它们是.NET中提供应用程序代码容器的方式,这样就可以唯一的标识代码及其内容。命名空间也用作.NET Framework中给项分类的一种方式。大多数项都是类型定义,例如System.Int32等。

        默认情况下,C#代码包含在全局命名空间中。这表示对于包含在这段代码中的项,只要按照名称进行引用,就可以由全局命名空间中的其他代码访问它们。可以使用namespace关键字位花括号中的代码块显示定义命名空间。如果在该命名空间代码的外部使用命名空间中的名称,就必须写出该命名空间中的限定名称。

        限定名称包括它所有的继承信息。基本上,这意味着,如果一个命名空间中的代码要使用另一个命名空间中定义的名称,就必须包括对该命名空间的引用。限定名称在不同的命名空间级别之间使用据点字符(.)。

        例如:

         namespace LevelOne

         {

              //code in LevelOne namespace

              //name "NameOne" defined

         }

         //code in global namespace

        这段代码定义了一个命名空间LevelOne,以及该命名空间中的一个名称NameOne。在命名空间LevelOne中编写的代码可以使用NameOne来引用该名称,不需要任何分类信息。但全局命名空间中的代码必须使用分类名称LevelOne.NameOne来引用这个名称。

        在命名空间中,使用关键字namespace还可以定义嵌套的命名空间。嵌套的命名空间通过其层次结构来引用,并使用据点区分层次结构的层次。这最好用一个例子来说明。考虑下面的命名空间:

         namespace LevelOne

         {

              //code in LevelOne namespace

              namespace LevelTwo

              {

                   //code in LevelOne.LevelTwo namespace

                   //name "NameTwo" defined

              }

         }

         //code in global namespace

        在全局命名空间中NameTwo必须引用为LevelOne.LevelTwo.NameTwo,在LevelOne命名空间中,则可以引用位LevelTwo.NameTwo,在LevelOne.LevelTwo命名空间中,则可以引用为NameTwo。

        要注意的是,名称由命名空间唯一定义的。可以在LevelOne和LevelTwo命名空间中定义名称NameThree:

         namespace LevelOne

         {

              //name "NameThree" defined

              namespace LevelTwo

              {

                   //name "NameThree" defined

              }

         }

        这里定义了两个互不干扰的NameThree,分别用LevelOne.NameThree和LevelOne.LevelTwo.NameThree访问。

        创建了命名空间后,就可以使用using语句简化对它们包含的名称的访问。实际上,using语句的意思是“我们需要这个命名空间中的名称,所以不要每次总是要求对它们分类”。例如,在下面的代码中,LevelOne命名空间中的代码可以访问LevelOne.LevelTwo命名空间中的名称,而无需分类:

         namespace LevelOne

         {

              using LevelTwo;

              namespace LevelTwo

              {

                   //name "NameTwo" defined

              }

         }

        LevelOne命名空间中的代码现在可以直接使用NameTwo引用LevelTwo.NameTwo。

        有时,与上面的NameThree示例一样,不同的命名空间中的相同名称会产生冲突,使系统崩溃(此时代码不能通过编译)。此时,可以为命名空间提供一个别名,作为using语句的一部分:

         namespace LevelOne

         {

              using LT = LevelTwo;

              //name "NameThree" defined

              namespace LevelTwo

              {

                   //name "NameThree" defined

              }

         }

        LevelOne命名空间中的代码可以把LevelOne.NameThree引用位NameThree,把LevelOne.LevelTwo.NameThree引用为LT.NameThree。

        using语句可以应用到包含它们的命名空间,以及该命名空间中包含的嵌套命名空间中。在上面的代码中,全局命名空间不能直接使用LT.NameThree。但如果using语句声明如下:

         using LT = LevelOne.LevelTwo;

         namespace LevelOne

         {

              //name "NameThree" defined

              namespace LevelTwo

              {

                   //name "NameThree" defined

              }

          }

        这样全局命名空间中的代码和LevelOne命名空间就可以使用LT.NameThree。

        这里有一点要注意:using语句本身不能访问令一个命名空间中的名称。除非命名空间中的代码以某种方式链接到项目上,或者代码是在该项目的源文件中定义的,或在链接到该项目的其他代码中定义的,否则就不能访问其中包含的名称。另外,如果包含命名空间的代码链接到项目上,无论是否使用using,都可以访问其中包含的名称。using语句便于我们访问这些名称,减少代码量,使之更合理。

        再看看以前我们ConsoleApplication1中的代码,下面的代码被应用到命名空间上:

         using System;

         using System.Collections.Generic;

         using System.Text;

     

         namespace ConsoleAppcation1

         {

              ...

         }

        using指令块中的3行代码使用using声明:在这段C#代码中使用Systen、System.Collections.Generic和System.Text命名空间,它们可以在该文件的所有命名空间中访问,无需分类。System命名空间是.NET Framework应用程序的根命名空间,提供了控制台应用程序所需要的所有基本功能。其他两个命名空间常常用于控制台应用程序,所以该程序包含了这3行代码。

        最后,为应用程序代码本身声明了一个命名空间ConsoleAppcation1。

    转载于:https://www.cnblogs.com/ta-bky/archive/2009/03/06/1404881.html

    展开全文
  • xaml--x命名空间

    2020-07-16 16:00:35
    Name属性定义FrameworkElement类中,这个类是WPF控件的基类,所以所有WPF控件都具有Name这个属性。 当一个元素具有Name属性时,你使用Name或x:Name效果是一样的。 比如和,。XAML编译器的动作都是声明名为btn的...
  • 今天将webserice里面的一个代码,拷到一个C#类,结果运行编译错误。DataBase = Server.MapPath...但是从内置Page类继承的类中可以直接写Server.MapPath”data.mdb”),应该是因为Page类已经包含了这些类路径。由此总
  • 1.头文件用于声明而不是用于定义 extern int ival = 10;...因为头文件包含在多个源文件,所以不应该含有变量或函数的定义。 关于头文件不应该含有定义这一规则,有三个例外: 头文件可以定义、值在...
  • 定义了namespace,并且本文件使用了这个命名空间,但总是觉得差点意思,不像h文件、cpp文件那么立体形象(h文件负责声明,cpp文件负责定义实现,其他文件如果要使用的话,先包含.h文件)。于是本着合理...
  • using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using MySQLDriverCS;...命名空间不能直接包含字段或方法之的成员 请问应该怎么修改???
  • JAVA开发环境: JDK—Java开发环境 JDK中包含JRE JRE—Java的运行环境 JRE中包含JVM虚拟机 JVM存在于JRE中bin目录内 JVM虚拟机两大特性: GC垃圾回收机制 通过new开辟的空间,不...1.任何的代码都应该在类中 2.通过关
  • 变量命名规则小结

    2013-04-02 22:00:38
    由于oc缺少名称空间概念,所有连接到程序里的oc一个名称空间中,这意味着实现了同名的两个框架是不能连接到一起的。解决方案是框架内的的类名都包含一个标明框架提供者的短前缀。这些前缀不仅用于类名,...
  • id:在命名空间中唯一的标识符,可以被用来引用这条语句。 parameterType:设置传入这条语句的参数的数据类型,如int,String...... resultType:设置从这条语句返回数据的类型。 注意如果返回的是集合,那应该...
  • JAVA_API1.6文档(中文)

    万次下载 热门讨论 2010-04-12 13:31:34
    javax.security.auth.x500 此包包含应该用来 Subject 存储 X500 Principal 和 X500 Private Crendentials 的。 javax.security.cert 为公钥证书提供。 javax.security.sasl 包含用于支持 SASL 的和接口...
  • EXT JS4体系

    2012-05-10 16:18:37
    代码,使用一致的命名习惯:命名空间和文件名,有助于保持你的代码组织、结构化和可读性。 1.  # 类名只能包含字母数字字符。数字是允许的,但大多数情况下不鼓励,除非他们属于一个技术术语。  # 类名...
  • HtmlWindow

    千次阅读 2006-07-14 17:06:00
    这个和MSHTML.IHTMLWindow2是不同的,VS2005新增加的,应该说是包装了原来的IHTMLWindow2 接口。那么和原来的用法就不同了。注意:此类 .NET Framework 2.0 版是新增的。 表示包含一个或多个 HtmlDocument ...
  • SqlHelper 类中实现的每种方法都提供了一组一致的重载。这提供了一种很好的使用 SqlHelper 类来执行命令的模式,同时为开发人员选择访问数据的方式提供了必要的灵活性。每种方法的重载都支持不同的方法参数,因此...
  • 命名空间相当于一个文件夹,里面包含的所有的类型都相当于里面的文件,这样就避免了命名冲突,例如MS::File、IBM::File两个类名就不会冲突,此时的全名应该包括namespace。  2.位于namespace下的类型或者函数...
  • Java 1.6 API 中文 New

    2013-10-26 14:08:22
    javax.security.auth.x500 此包包含应该用来 Subject 存储 X500 Principal 和 X500 Private Crendentials 的。 javax.security.cert 为公钥证书提供。 javax.security.sasl 包含用于支持 SASL 的和接口。 ...
  • java jdk-api-1.6 中文 chmd

    2018-03-22 11:32:15
    javax.security.auth.x500 此包包含应该用来 Subject 存储 X500 Principal 和 X500 Private Crendentials 的。 javax.security.cert 为公钥证书提供。 javax.security.sasl 包含用于支持 SASL 的和接口...
  • JavaAPI中文chm文档 part2

    2011-08-19 08:58:42
    javax.security.auth.x500 此包包含应该用来 Subject 存储 X500 Principal 和 X500 Private Crendentials 的。 javax.security.cert 为公钥证书提供。 javax.security.sasl 包含用于支持 SASL 的和接口...
  • JavaAPI1.6中文chm文档 part1

    热门讨论 2011-08-19 08:33:34
    javax.security.auth.x500 此包包含应该用来 Subject 存储 X500 Principal 和 X500 Private Crendentials 的。 javax.security.cert 为公钥证书提供。 javax.security.sasl 包含用于支持 SASL 的和接口...
  • 一小时内学会 C#(txt版本)

    热门讨论 2009-08-19 18:09:37
    C# 中所有内容都打包在类中,而所有的类又打包在命名空间中(正如文件存与文件夹中)。和 C++ 一样,有一个主函数作为你程序的入口点。C++ 的主函数名为 main,而 C# 中是大写 M 打头的 Main。 类块或结构定义之后...
  • ASP.NET项目各个文件夹的含义

    千次阅读 2014-01-20 18:08:58
    1. Bin文件夹  Bin文件夹包含应用程序所需的,用于控件、组件或者需要引用的任何其他代码的可部署程序集。...换句话说,如果两个不同的程序集定义相同的(相同的命名空间和名称),则ASP.NET运行库不能决定应该使用哪
  • 定长字符串模板

    2006-03-16 00:00:00
    2.引入cfc命名空间 using namespace;; // 可以略去 3.实例化对象 cfc::small_string<;16>; s=";hello";;; // 一个缓冲区长度为16的定长字符串,内容为";hello"; // 最大长度为...
  • Qt怎么用Ui文件

    2012-08-10 13:37:34
    这里还有一点比较有意思的地方,就是ui文件提供的包含在了名为Ui的name space里,这样做的目的是将ui文件的命名空间与用户的代码分离,避免两者出现命名冲突的情况。相应的,我们写代码的时候也要注意在使用ui...
  • C#.NETApp_Code,App_Data等文件夹的作用

    千次阅读 2013-11-01 15:37:35
    1. Bin文件夹   Bin文件夹包含应用程序所需的,用于控件、组件或者需要引用的任何其他代码的可部署程序集。...换句话说,如果两个不同的程序集定义相同的(相同的命名空间和名称),则ASP.NET运行库不能决定应该使
  • 这种特性是如此重要以至于System.Collections.Generic命名空间中存在一个专门的泛型数据结构库。当数据结构具有此库中能找到的泛型实现时,就会讨论它的用途。本章结尾处介绍了衡量书讨论的数据结构与算法性能...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 210
精华内容 84
关键字:

命名空间应该包含在类中