static成员

static成员在C++中用于声明属于类本身的成员,而非特定对象的成员。static成员变量在所有对象间共享,static成员函数只能访问static成员变量。

static成员变量必须在类外定义和初始化,不能在构造函数中初始化。例如:

class MyClass {
public:
    static int count;
};
int MyClass::count = 0;  // 必须在类外初始化

static成员函数不能使用this指针,也不能访问非static成员变量。调用时可以直接通过类名访问:

class MyClass {
public:
    static void printCount() {
        cout << count << endl;
    }
};
MyClass::printCount();

友元类

友元类可以访问另一个类的私有成员,破坏了封装性,但提供了灵活性。友元关系是单向的,不具有传递性。

声明友元类的方式:

class A {
    friend class B;  // B是A的友元类
private:
    int secret;
};

class B {
public:
    void accessA(A& a) {
        cout << a.secret << endl;  // 可以访问A的私有成员
    }
};

内部类

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

定义和使用示例:

class Outer {
private:
    int outerData;
public:
    class Inner {
    public:
        void accessOuter(Outer& o) {
            cout << o.outerData << endl;
        }
    };
};

Outer::Inner innerObj;  // 使用作用域解析符创建内部类对象

匿名对象

匿名对象是没有名字的临时对象,通常用于一次性操作。匿名对象的生命周期仅限于当前表达式。

创建和使用匿名对象:

class Temp {
public:
    Temp() { cout << "Constructor" << endl; }
    ~Temp() { cout << "Destructor" << endl; }
    void show() { cout << "Show" << endl; }
};

Temp().show();  // 创建匿名对象并立即调用方法

对象拷贝时的编译器优化

编译器可能会对对象拷贝进行优化,特别是在返回值优化(RVO)和命名返回值优化(NRVO)的情况下。

常见的优化场景:

class Test {
public:
    Test() { cout << "Constructor" << endl; }
    Test(const Test&) { cout << "Copy Constructor" << endl; }
};

Test createTest() {
    return Test();  // 可能被优化,不调用拷贝构造函数
}

Test t = createTest();  // RVO优化

编译器可能会消除多余的拷贝操作,直接在目标位置构造对象。在C++17中,部分情况下强制要求进行这种优化。

Logo

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

更多推荐