C++类与对象深入之静态成员与友元及内部类详解
静态成员
静态成员是指在类中被声明为静态的成员变量或静态的成员函数。静态成员不是直接属于某个对象,而是属于这个类本身。在类定义时,静态成员变量的分配空间并不会影响到对象的大小,只分配一次空间。静态成员函数不能访问非静态成员变量和非静态成员函数,只能访问静态成员变量和静态成员函数。
静态成员变量
静态成员变量是指被 static 关键字修饰的成员变量。在类定义时只声明,不定义,定义需要在类外进行。在定义时需要加上类名和分号。
class A {
public:
static int x;
};
int A::x = 0; // 类A的静态成员变量初始化
静态成员函数
静态成员函数是指被 static 关键字修饰的成员函数。静态成员函数不需要对象实例即可访问。静态成员函数没有 this 指针。
class A {
public:
static void func() {
std::cout << "This is a static function!" << std::endl;
}
};
A::func(); // 调用静态成员函数
静态成员变量的使用
静态成员变量是被类的所有实例共享的,所以它的值会在不同实例之间保持一致。可以通过 类名::静态成员变量
来访问这个静态成员变量。
class A {
public:
static int x;
};
int main() {
A a1, a2;
a1.x = 100;
std::cout << a2.x << std::endl; // 100
std::cout << A::x << std::endl; // 100
}
静态成员函数的使用
静态成员函数不会访问对象实例,不需要 this 指针。静态成员函数可以使用类名调用。
class A {
public:
static void func() {
std::cout << "This is a static function!" << std::endl;
}
};
int main() {
A::func(); // 调用静态成员函数
}
友元
友元指的是可以访问一个类的私有成员的非成员函数,友元不是类的成员,也不是类的对象。友元可以是普通的函数、类、成员函数、等等。
友元函数
在类定义中,使用 friend
关键字来声明一个友元函数。友元函数可以访问类的私有成员。
class A {
friend void func(); // 声明友元函数
private:
int x;
};
void func() {
A a;
a.x = 100; // 访问类的私有成员
}
int main() {
func(); // 调用友元函数
}
友元类
在类定义中,使用 friend
关键字来声明一个友元类。友元类可以访问当前类的私有成员。
class B {
friend class A; // 声明友元类
private:
int x;
};
class A {
public:
void func() {
B b;
b.x = 100; // 访问当前类的友元类B的私有成员
}
};
int main() {
A a;
a.func(); // 调用不同类的友元
}
内部类
内部类是指在一个类的内部定义的类,与外部类相比具有更高的封装性。内部类可以使用外部类的所有成员,并且外部类可以使用内部类的所有成员。
静态内部类
静态内部类指的是被 static 修饰的内部类,静态内部类的对象可以直接调用,不需要有外部类的实例。静态内部类不能访问外部类的非静态成员。
class A {
public:
static int x;
static class B {
public:
static void func() {
std::cout << "This is a static inner class!" << std::endl;
std::cout << "x = " << x << std::endl;
}
};
};
int A::x = 100;
int main() {
A::B::func();
}
成员内部类
成员内部类指的是没有被 static 修饰,被定义在一个类的内部的类。成员内部类可以访问外部类的所有成员,包括私有成员。
class A {
public:
int x;
class B {
public:
B(A& a): a_(a) {}
void func() {
std::cout << "This is a member inner class!" << std::endl;
std::cout << "x = " << a_.x << std::endl;
}
private:
A& a_;
};
};
int main() {
A a;
a.x = 100;
A::B b(a);
b.func();
}
以上就是关于C++类与对象深入之静态成员与友元及内部类详解的完整攻略,希望能够对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++类与对象深入之静态成员与友元及内部类详解 - Python技术站