C++静态成员与友元类精讲
·
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中,部分情况下强制要求进行这种优化。
更多推荐



所有评论(0)