• 命名空间(namespace)// 友元函数


    17.2、命名空间

    命名空间(namespace)为防止名字冲突提供了更加可控的机制。命名空间能够划分全局命名空间,这样使用独立开发的库更加容易了。一个命名空间就是一个作用域,通过在命名空间内部定义库中的名字,库的作者(以及用户)可以避免全局名字固有的限制。

    1、命名空间的定义(以关键字namespace开始,后接命名空间的名字)

    namespace cplusplus_primer {
             class Sales_item ( /*... */ };
             Sales_item operator+(const Sales_item&,
                                                 const Sales_item&);
             class Query {
             public:
                   Query(const std::string&);
                   std::ostream &display(std::ostream&) const;
                   // ..
             };
             class Query_base { / * . . * /};
    }

    这段代码定义了名为cplusplus_primer的命名空间,它有四个成员:两个类,一个重载的+操作符,一个函数。

    命名空间可以在全局作用域或者其他作用域内部定义,但不能在函数或者类内部定义。

    命名空间内部可以放入:类,变量(以及它们的初始化),函数(以及它们的定义)、模板,以及其他命名空间。

    命名空间中定义的名字可以被命名空间中的其他成员直接访问,命名空间外部的代码必须指出名字定义在哪个命名空间中。

    从命名空间外部使用命名空间成员时,可以编写using声明:

    using cplusplus_primer::Query;

    在这个using声明之后,程序可以无需cplusplus_primer限定符而直接使用名字Query。

    2、命名空间可以是不连续的,与其他作用域不同,命名空间可以在几个部分中定义。命名空间由它的分离定义部分的总和构成,命名空间是累积的。一个命名空间的分离部分可以分散在多个文件中,在不同文本文件中的命名空间定义也是累积的。

    命名空间可以不连续意味着,可以用分离的接口文件和实现文件构成命名空间,因此,可以用与管理自己的类和函数定义相同的方法来组织命名空间:

    (1)定义类的命名空间成员,以及作为类接口的一部分的函数声明与对象声明,可以放在头文件中,使用命名空间成员的文件可以包含这些头文件。

    (2)命名空间成员的定义可以放在单独的源文件中。

    [注]定义多个不相关类型的命名空间应该使用分离的文件,表示该命名空间定义的每个类型。

    友元函数

    如果在本类以外的其它地方定义了一个函数(这个函数可以是不属于任何类的非成员函数,也可以是其它类的成员函数),在类体中用friend对该函数进行声明,此函数就称为本类的友元函数。一个类的友元函数可以访问这个类中的private成员。
  • 相关阅读:
    Android UI--自定义ListView(实现下拉刷新+加载更多)
    12306火车票订票网站的一个Bug
    golang中赋值string到array
    Node.js学习(14)----EJS模板引擎
    操作系统
    springMVC学习笔记--初识springMVC
    sqlplus 连接数据库报错SP2-0642: SQL*Plus internal error state 2130, context 0:0:0
    对于事务和同步(并发)的简要理解
    Jsoup入门
    [LeetCode]Single Number
  • 原文地址:https://www.cnblogs.com/rong86/p/3454026.html
Copyright © 2020-2023  润新知