首先关于前置声明,有以下几点要注意:
在b.h头文件中引入类a时,有两种方式,前置声明和 #include “a.h”,建议使用前置声明,当a.h的私有成员改变时,b.h不需要重新编译。所以能用前置声明代替#include 的时候,尽量用前置声明 。
使用前置声明注意事项:B类中成员A a编译器为a分配内存空间的时候必须知道d的大小,所以应该改成指针代替,A *a;
其次关于命名空间:
1、为什么引入命名空间?
首先可以假定这样一个情景:
在文件中可以定义全局变量,它的作用域是整个程序。如果在文件A中定义了一个变量a int a=3;
在文件B中可以再定义一个变量a int a=5;
在分别对文件A和文件B进行编译时不会有问题。但是,如果一个程序包括文件A和文件B,那么在进行连接时,会报告出错,因为在同一个程序中有两个同名的变量,认为是对变量的重复定义。
由此可以引入命名空间:实际上就是一个由程序设计者命名的内存区域,程序设计者可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分隔开来。
2、使用命名空间成员的方法
使用命名空间别名:namespace Television //声明命名空间可以用一个较短而易记的别名代替它。如:
namespace TV=Television; //别名TV与原名Television等价
使用using命名空间成员名:using后面的命名空间成员名必须是由命名空间限定的名字。例如: using nsl::Student;
以上语句声明:在本作用域(using语句所在的作用域)中会用到命名空间ns1中的成员Student,在本作用域中如果使用该命名空间成员时,不必再用命名空间限定。例如在用上面的using声明后,在其后程序中出现的Student就是隐含地指nsl::Student。
using声明的有效范围是从using语句开始到using所在的作用域结束。
3、标准命名空间std
我们每次写c++时头文件都会写Using namespace std;这是什么意思呢?
其实,标准C++库的所有的标识符都是在一个名为std的命名空间中定义的,或者说标准头文件(如iostream)中函数、类、对象和类模板是在命名空间 std中定义的。std是standard(标准)的缩写,表示这是存放标准库的有关内容的命名空间,含义请楚,不必死记。
为什么使用命名空间的前置声明:
很多时候,你是在一个专门的头文件中声明一个类并在不同的源文件中独立地定义其成员函数。那么如何将命名空间成员类分离成多个源文件呢?
下面举例说明:
下面是名为 Foo.hpp 的头文件,其中定义了一个名为NS的命名空间,它包含类Foo的声明:
//Foo.hpp
namespace NS
{
class Foo
{
public:
void f();
void g();
};
}//close NS
另外,在一个单独的源文件Foo.cpp中,首先包含头文件Foo.hpp以便实现类Foo的成员函数f()和g():
//Foo.cpp
#include "Foo.hpp"
void NS::Foo::f()
{ /*..*/ }
void NS::Foo::g()
{ /*..*/ }
为了使用命名空间成员,必须使用成员的全路径名,它由命名空间后跟::合成原名组成。因此,类Foo的全路径名是NS::Foo。这样编译器便可以知道NS是一个名字空间名,头文件Foo.hpp必须在引用NS之前被包含。
命名空间是可以扩展的。也就是说可以声明类,而且所声明的类在其它的.cpp文件中是相同的命名空间成员:
//Bar.hpp
namespace NS //扩展 NS
{
class Bar
{
public:
void a();
void b();
};
}
在Bar.cpp文件中:
#include "Bar.hpp"
void NS::Bar::a()
{/*..*/}
void NS::Bar::b()
{/*..*/}
使用方式有两种:1、using NS::Bar; //使用命名空间
2、NS::Bar b; //全路径名
下面为转载的其他博客的关于命名空间中类定义和具体使用的实例:
网址:https://blog.csdn.net/wb175208/article/details/79986445
SpaceA.h
#pragma oncenamespace TestA {
class SpaceA {
public:
SpaceA();
~SpaceA();
void print();
};
}
SpaceA.cpp
#include "SpaceA.h"using namespace TestA;
SpaceA::SpaceA() {
}
SpaceA::~SpaceA() {
}
void SpaceA::print() {
int i = 0;
i++;
}
SpaceB.h
#pragma once
//在使用之前声明一下
namespace TestA {
class SpaceA;
}
namespace TestB {
class SpaceB {
public:
SpaceB();
~SpaceB();
void printB();
private:
TestA::SpaceA* a;//使用的时候,必须加上命名空间
};
}
SpaceB.cpp
#include "SpaceB.h"#include "SpaceA.h"using namespace TestB;using namespace TestA;
SpaceB::SpaceB() {
a = new SpaceA;
}
SpaceB::~SpaceB() {
}
void SpaceB::printB() {
int i = 9;
i++;
a->print();
}
在使用的时候:
#include "SpaceB.h"using namespace TestB;
int main(int argc, char *argv[]){
SpaceB b;
b.printB();
}
谢谢观看!如有错误,请指正!