C++ 类作用域(class scope)
简单说:类里面定义的成员(变量、函数),都属于类作用域,只能在类内/通过对象/类名访问。
一、什么是类作用域
在 class { ... } 大括号内部的所有:
- 成员变量(属性)
- 成员函数(方法)
- 类型别名、枚举、静态成员
都处在类作用域 ,外部不能直接访问。
cpp
class Person {
public:
int age; // 类作用域
void show(); // 类作用域
};
// age、show 不能直接用,必须通过对象/类名
二、访问规则(3种方式)
1. 类内成员函数:直接访问
成员函数天然在类作用域内,直接用成员名
cpp
class Person {
public:
int age = 18;
void print() {
cout << age; // 直接访问,不用对象
}
};
2. 类外普通函数:必须用 . / ->
cpp
Person p;
p.age = 20;
p.print();
3. 静态成员:用 类名::
cpp
class Person {
public:
static int num;
};
int Person::num = 100; // 类外初始化
Person::num = 200; // 类作用域访问符 ::
三、作用域分辨符 ::(重点)
类名::成员名 专门用来访问类作用域的成员
- 类外定义成员函数
- 访问静态成员
- 解决名字冲突
cpp
class Person {
public:
void show();
};
// 类外实现,必须加 Person::
void Person::show() {
cout << "hello";
}
四、类作用域 vs 局部作用域 vs 全局作用域
- 全局作用域:函数外面,整个文件可用
- 局部作用域 :函数/代码块
{}内,仅内部可用 - 类作用域:class 内部,必须通过对象/类名访问
名字查找优先级(从近到远)
局部 > 类作用域 > 全局
cpp
int a = 100; // 全局
class A {
public:
int a = 20; // 类作用域
void f() {
int a = 5; // 局部
cout << a; // 输出5,优先局部
}
};
- 想访问类内的a:
this->a - 想访问全局的a:
::a
五、this 指针与类作用域
成员函数里,this 代表当前对象,强制指定类作用域的成员,避免局部变量屏蔽
cpp
void setAge(int age) {
this->age = age;
// this->age 是类成员,age是形参
}
六、访问控制(和类作用域配套)
类作用域分3种访问权限:
public:外部可访问private:仅类内可访问(默认)protected:类内 + 子类可访问
极简总结(必背)
- 类作用域 :class 大括号内,成员必须通过对象或
类名::访问 - :::作用域解析符,访问类成员、静态成员
- 名字查找:局部 > 类 > 全局
this->可显式访问类成员,防止被局部变量覆盖