C++核心特性:static成员与友元类解析
·
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; // 转移所有权
}
};
更多推荐



所有评论(0)