static成员
static成员属于类而非特定对象,所有对象共享同一份static成员。static成员变量需在类外初始化,static成员函数只能访问static成员变量,不能访问非static成员。
class Example {
public:
static int count; // 声明
static void printCount() { cout << count; }
};
int Example::count = 0; // 类外初始化
友元类
友元类可以访问当前类的私有成员,破坏了封装性但提高了灵活性。友元关系是单向的,不具有传递性。
class A {
friend class B; // B是A的友元类
private:
int secret;
};
class B {
public:
void showA(A& a) { cout << a.secret; } // 可访问A的私有成员
};
内部类
内部类定义在另一个类内部,可以访问外部类的所有成员(包括私有)。内部类与外部类相互独立,仅是语法上的嵌套关系。
class Outer {
class Inner { // 内部类
public:
void accessOuter(Outer& o) { cout << o.data; }
};
private:
int data;
};
匿名对象
匿名对象是没有名字的临时对象,生命周期仅限于当前行。常用于一次性操作或函数传参。
class Temp {
public:
Temp() { cout << "Created"; }
~Temp() { cout << "Destroyed"; }
};
int main() {
Temp(); // 匿名对象,该行结束后立即析构
}
编译器优化:对象拷贝
编译器会优化不必要的拷贝操作,常见场景包括:
- 返回值优化(RVO):直接构造目标对象避免临时对象拷贝
- 命名返回值优化(NRVO):对命名局部变量做类似优化
- 复制消除(Copy Elision):C++17强制要求的部分场景优化
class Heavy {
public:
Heavy() { cout << "Construct"; }
Heavy(const Heavy&) { cout << "Copy"; }
};
Heavy create() {
return Heavy(); // RVO优化,无拷贝构造调用
}
关键注意事项
- static成员函数没有this指针,不能声明为const或volatile
- 友元类过度使用会破坏封装,建议优先考虑设计模式
- 内部类实际是独立类,外部类仅作为命名空间限定
- 匿名对象多用于测试或链式调用场景
- 编译器优化行为可通过-fno-elide-constructors选项关闭验证
C++类成员与编译优化详解
3425

被折叠的 条评论
为什么被折叠?



