static成员

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

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

友元类

友元类可以访问当前类的私有成员,破坏了封装性,但提高了效率。友元关系是单向的,不具有传递性。

class A {
    friend class B; // B是A的友元类
private:
    int secret;
};
class B {
public:
    void peek(A& a) { cout << a.secret; } // 可以访问A的私有成员
};

内部类

内部类定义在另一个类的内部,可以访问外部类的所有成员(包括私有成员)。内部类与外部类没有特殊的继承或包含关系。

class Outer {
    class Inner {
    public:
        void show(Outer& o) { cout << o.data; }
    };
private:
    int data;
};

匿名对象

匿名对象是没有名字的临时对象,生命周期通常只有一行代码。常用于函数返回值或临时测试。

class Temp {
public:
    Temp() { cout << "Created"; }
    ~Temp() { cout << "Destroyed"; }
};
int main() {
    Temp(); // 匿名对象,立即创建并销毁
}

编译器优化:对象拷贝

编译器会自动优化不必要的拷贝操作,常见优化场景包括返回值优化(RVO)和命名返回值优化(NRVO)。

class BigData {
public:
    BigData() { cout << "Construct"; }
    BigData(const BigData&) { cout << "Copy"; }
};
BigData create() {
    return BigData(); // RVO优化,避免拷贝
}
BigData createNRVO() {
    BigData b;
    return b; // NRVO优化,避免拷贝
}

移动语义优化

C++11引入移动语义,通过右值引用减少拷贝开销。移动构造函数将资源所有权转移而非复制。

class Movable {
    int* data;
public:
    Movable(Movable&& other) : data(other.data) { 
        other.data = nullptr; // 转移所有权
    }
};

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐