- 把一个类定义在另一个类的内部,就称为内部类。内部类可以有效避免名字冲突问题。而名字空间是解决该问题的终极解决方案,内部类较为常用,名字空间不太常用。
内部类
class A
{
public:
//定义内部类
class B
{
public:
char name[64];
}
public:
A()
{
}
};
A::B inner;
strcpy(inner.name,"hello");
此时内部类的名字为A::B
- 内部类若被private或protected修饰时,则被隐藏在内部,外部无法访问
- 内部类可以自由访问外部类的private或protected成员
- 内部类B和外部类A既不是父类和子类的关系,也不是朋友关系
- A::B和C::B是不冲突的,虽然名字一样,但这是两个不一样的类
内部类的分离式写法
///A.h
class A
{
public:
class Inner
{
public:
Inner();
void Set(int v);
private:
int value;
}
public:
A();
Inner Get();
public:
Inner m_in;
};
///A.cpp
//内部类的定义
A::Inner::Inner() : value(11)
{
}
void A::Inner::Set(int v)
{
this->value = v;
}
//外部类的定义
A::A()
{
}
A::Inner A::Get() //注意,返回值是Inner类型的,要写成A::Inner
{
return m_in;
}
enum类型
-
enum用于定义枚举类型,本质上等同于int型
//enum定义一个新的整数类型Weekday,定义了7个字面常量,Sunday(0),Monday(1)... enum Weekday { Sunday, Monday, ... }; Weekday day = Monday; //day的值为1,占有4个字节 //black为0,red指定为2,green为red+1为3,blue指定为5 enum Color { black, red = 2, green, blue = 5 };
内部enum类型
在类里定义enum类型
class Painter
{
public:
enum Color
{
RED = 0xFF0000,
GREEN = 0x00FF00,
BLUE = 0x0000FF
};
};
Painter::Color clr = Painter::RED;
名字空间
把很多名字(类名,函数名,全局变量名)定义在一个空间里,然后用一个范围符做前缀
名字空间的定义
namespace tinyxml
{
class Document
{
};
class Element
{
};
}
tinyxml::Document doc;
tinyxml::Element elem;
分离式写法
///tinyxml.h
namespace tinyxml
{
class Document
{
public:
Document();
int Open();
int AddElement(const Element& elem)
};
class Element
{
public:
Element();
public:
char name[32];
char value[64];
};
}
///tinyxml.cpp
#include "tinyxml.h"
namespace tinyxml
{
Element::Element()
{
}
Document::Document()
{
}
...
}
using语句:解除前缀
在main函数中使用名字空间的名字需要加上前缀tinyxml::,这有些麻烦,为了避免,在main函数开头用using语句
#include "tinyxml.h"
using namespace tinyxml;
int main()
{
Document doc;//前面的tinyxml::可以忽略
return 0;
}
仅使用名字空间的部分名字
using tinyxml::Document;
网友评论