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区域,影响其可见性。
- 匿名对象适合简单操作,复杂逻辑建议使用命名对象。
- 编译器优化行为与编译器实现相关,不可完全依赖优化结果。
1255

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



