深入解析C++静态成员与友元机制

static成员

static成员分为static成员变量和static成员函数。static成员变量属于类而非对象,所有对象共享同一份数据,必须在类外初始化。static成员函数没有this指针,只能访问static成员变量,不能访问非static成员变量。

class MyClass {
public:
    static int count; // 声明static成员变量
    static void showCount() { // static成员函数
        cout << count << endl;
    }
};
int MyClass::count = 0; // 类外初始化

友元类

友元类可以访问另一个类的私有成员。友元关系是单向的,不具有传递性。友元声明可以在类的任意位置,不受访问权限限制。

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

内部类

内部类定义在另一个类的内部,可以访问外部类的所有成员(包括private)。内部类与外部类相互独立,内部类对象不依赖外部类对象存在。

class Outer {
private:
    int outer_data;
public:
    class Inner { // 内部类
    public:
        void func(Outer& o) {
            o.outer_data = 20; // 访问外部类私有成员
        }
    };
};

匿名对象

匿名对象是没有名称的临时对象,生命周期仅限于当前语句。常用于一次性函数调用或作为函数参数传递。

class Temp {
public:
    void show() { cout << "Temp" << endl; }
};
int main() {
    Temp().show(); // 匿名对象调用成员函数
    return 0;
}

对象拷贝时的编译器优化

编译器在特定情况下会优化对象拷贝,减少不必要的构造和析构:

  • 返回值优化(RVO):函数返回临时对象时,直接在调用处构造。
  • 命名返回值优化(NRVO):函数返回命名对象时,直接在调用处构造。
  • 构造时拷贝优化:用临时对象初始化新对象时,直接构造新对象而非先构造临时对象再拷贝。
class Test {
public:
    Test() { cout << "构造" << endl; }
    Test(const Test&) { cout << "拷贝" << endl; }
};
Test func() {
    return Test(); // RVO优化
}
int main() {
    Test t = func(); // 可能只调用一次构造函数
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值