C++静态成员与友元类全解析

static成员

static成员属于类而非特定对象,所有对象共享同一份数据。static成员变量在类内声明,类外初始化,不占用对象内存空间。static成员函数只能访问static成员变量,不能访问非static成员变量。

class MyClass {
public:
    static int count; // 声明
    static void printCount() { cout << count; }
};
int MyClass::count = 0; // 类外初始化

友元类

友元类可以访问当前类的私有成员。友元关系是单向的,不具有传递性。友元破坏了封装性,需谨慎使用。

class A {
    friend class B; // 声明B为友元类
private:
    int secret;
};
class B {
public:
    void useA(A& a) { a.secret = 42; } // 可访问A的私有成员
};

内部类

内部类定义在另一个类内部,可以访问外部类的所有成员(包括private)。内部类与外部类相互独立,需要外部类对象才能访问外部类非static成员。

class Outer {
    class Inner {
    public:
        void accessOuter(Outer& o) { o.data = 10; }
    };
private:
    int data;
};

匿名对象

匿名对象是没有名字的临时对象,生命周期仅限于当前语句。常用于函数返回值或单次方法调用。

class Temp {
public:
    void show() { cout << "temp"; }
};
int main() {
    Temp().show(); // 匿名对象调用后立即销毁
}

编译器优化

编译器可能对对象拷贝进行优化,常见场景包括:

  • 返回值优化(RVO):函数返回临时对象时,直接在调用处构造对象,避免拷贝。
  • 命名返回值优化(NRVO):函数返回命名局部对象时,直接在调用处构造对象。
  • 拷贝消除:多个临时对象拷贝可能被合并为一次构造。
class BigObj {
public:
    BigObj() { cout << "构造"; }
    BigObj(const BigObj&) { cout << "拷贝"; }
};
BigObj create() {
    return BigObj(); // RVO优化,可能不触发拷贝构造函数
}

注意事项

  • static成员函数没有this指针,不能声明为const或virtual。
  • 友元关系不能被继承,每个子类需要单独声明友元。
  • 内部类可以定义在public、protected或private区域,影响其可见性。
  • 匿名对象适合简单操作,复杂逻辑建议使用命名对象。
  • 编译器优化行为与编译器实现相关,不可完全依赖优化结果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值