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;
}
352

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



