C++ 类作用域 通俗讲解

1. 什么是类作用域

class / struct 大括号 {} 内部,就是类作用域
类里定义的成员(成员变量、成员函数、类型别名、枚举),仅在类内部默认可见。

class Test
{
    // 全部属于类作用域
public:
    int a;
    void func()
    {
        // 类内可以直接访问所有成员
        a = 10;
    }
};

2. 核心规则

(1)类内:直接访问成员

成员函数、类内嵌套类型,不用加任何前缀,直接使用同类成员。

(2)类外访问必须加限定

外部代码访问成员,需要:

  • 对象.成员
  • 指针->成员
  • 类名::静态成员
Test t;
t.a = 20;       // 对象访问
t.func();
Test::staticFun(); // 静态成员

(3)成员函数体外定义,仍属于类作用域

函数写在类外面,只要用 类名:: 限定,函数内部依然能直接使用类所有成员:

class Test
{
public:
    int x;
    void show();
};

// 函数属于Test类作用域
void Test::show()
{
    cout << x; // 直接访问成员x
}

(4)类作用域有访问控制(public/private/protected)

就算在同一个类作用域,权限不同外部能不能访问有区别:

  • private:仅类内部、友元可见
  • protected:类内 + 子类 + 友元
  • public:任意地方都能访问

(5)类作用域独立,不同类同名成员互不干扰

两个类都有同名变量/函数,不会冲突,靠类名区分。

class A { public: int num; };
class B { public: int num; };
A a; B b;
a.num = 1;
b.num = 2;

3. 类内先声明、后使用

类作用域内,代码顺序有约束:
成员只能使用前面已经声明的内容,后面定义的不能直接提前用。

class Demo
{
public:
    void f() { g(); } // 报错,g还没声明
    void g() {}
};

解决:函数声明放前面,定义放后面。

4. 静态成员特殊点

静态成员属于类作用域,不属于某个对象,不依赖实例就能访问:

class Demo
{
public:
    static int val;
};
int Demo::val = 100;

// 直接用类名访问
cout << Demo::val;

5. 和块作用域区分

  1. 块作用域{} 代码段,变量出括号销毁;
  2. 类作用域class{},成员生命周期由对象/静态决定,作用范围是整个类。

极简总结

所有写在 class 大括号里的变量、函数、类型共享同一个类作用域;
类内随便互访,类外必须加 对象. / 类名::;配合访问权限控制外部能否调用。

更多推荐