目录
在C++中,类的公有静态数据成员、静态成员函数、类型别名、枚举类型及其成员(枚举常量)、嵌套类/结构体/联合体等可以通过类名加作用域解析运算符(::
)来直接访问。对于非静态的公有数据成员和成员函数,你需要一个类的实例(对象)来访问它们。
1.静态成员
静态成员(无论是数据成员还是成员函数)是与类本身相关联的,而不是与类的特定对象相关联。因此,你可以直接通过类名加::
来访问它们,而不需要创建类的实例。
class MyClass {
public:
static int staticMember; // 静态数据成员
static void staticFunction(); // 静态成员函数
// ... 其他成员 ...
};
int MyClass::staticMember = 0; // 定义并初始化静态数据成员
void MyClass::staticFunction() {
// 静态成员函数的实现
}
int main() {
// 直接通过类名访问静态成员
MyClass::staticMember = 42;
MyClass::staticFunction();
// ... 其他代码 ...
return 0;
}
2.类型别名
类型别名(使用typedef
或using
定义)是另一种可以直接通过类名加::
来访问的公有成员。类型别名在模板编程中尤其有用,因为它们允许你为复杂的类型表达式提供简短的名称。
class MyClass {
public:
typedef int ValueType; // 使用 typedef 定义类型别名
using AnotherType = double; // 使用 using 定义类型别名(C++11及以后)
};
int main() {
// 直接通过类名访问类型别名
MyClass::ValueType var1 = 10;
MyClass::AnotherType var2 = 20.0;
return 0;
}
3. 枚举类型及其成员:
class MyClass {
public:
enum Color { RED, GREEN, BLUE };
};
int main() {
MyClass::Color color = MyClass::RED; // 访问枚举类型及其成员
return 0;
}
4.嵌套类/结构体/联合体:
class MyClass {
public:
struct NestedStruct {
int x;
float y;
};
};
int main() {
MyClass::NestedStruct ns; // 声明嵌套结构体类型的变量
ns.x = 10;
ns.y = 3.14f;
return 0;
}
5.生存周期
静态数据成员具有静态生存周期 而函数和类型别名本身不占用存储空间 类型别名是在其声明的地方定义的,仅仅是一个名称的引用 函数是在程序编译时确定的代码块,它们不是程序运行时的对象(实例),因此没有与对象相关的生命周期概念。 |
6.typedef typename作用
typedef typename _Alloc_traits::size_type size_type;
那么问题来了,为什么要加上typename关键字?
直接用typedef _Alloc_traits::size_type size_type; 不行吗
实际上,这是因为对于形如AA::BB
这样的形式,它有可能是一个类型,也有可能是类的静态成员,这个时候加上typename就是为了告诉编译器,它后面的一大串字符串都是一个类型。