)
在 C 的面向对象编程中封装是三大特性之一它通过访问限定符public、protected、private来控制类成员的可见性从而保护数据安全。然而在某些场景下我们需要让特定的函数或类能够访问类的私有成员这时 C 提供了friend友元机制来打破封装的限制。此外类的嵌套定义内部类和匿名对象也是 C 中常见且实用的语法特性。本文将围绕友元、内部类和匿名对象三个主题展开通过代码示例帮助读者理解它们的用法、特点与注意事项。友元对于一个类来说成员访问限定符可以很好地保护类中某些成员不被外部访问但存在一个特殊的关键字friend。它放在函数或类的前面用来声明该函数或类是该类的友元函数或友元类。classA{//类B是类A的友元类friendclassB;//友元函数friendvoidSwap(Aa);public:A(inta11,inta21):_a1(a1),_a2(a2){;}private:int_a1;int_a2;};该友元函数和友元类可以无视成员访问限定符直接访问该类的所有成员。voidSwap(Aa){inttmpa._a1;a._a1a._a2;a._a2tmp;}classB{public:B(Aa):_b1(a._a1),_b2(a._a2){;}private:int_b1;int_b2;};就像朋友一样声明Swap函数和类 B是类 A的朋友它们就可以访问类 A的所有成员了。这是一种单向关系类A的友元是类B类B可以直接访问类A的所有成员但类A不能直接访问类B中的所有成员。此外友元也不具有传递性类A的友元是类B类B的友元是类C但不能说类A的友元是类C。友元的使用会破坏类封装性增强耦合度所以尽量少用。内部类内部类就是在类中封装一个类它具有以下特点内部类和外部类是两个独立的类互不干扰也不影响各自类大小。内部类默认为外部类的友元类。内部类受到外部类的访问限定符限制。比如我在类A内封装一个类B。classA{friendvoidSwap(Aa);public:A(inta11,inta21):_a1(a1),_a2(a2){;}//内部类classB{public:B(Aa):_b1(a._a1),_b2(a._a2){;}private:int_b1;int_b2;};private:int_a1;int_a2;};受到public限定符影响类 B 可以被外部访问但需要通过类域查找。A::Bb1(A a1);//实例化类B对象也可以将类B限定为类A的专有类。匿名对象我们可以通过类来实例化出对象此外还有一种实例化实例化出的是匿名对象它的使用如下classA{public:A(inta11,inta22):_a1(a1),_a2(a2){;}private:int_a1;int_a2;};intmain(){A a;//实例化对象A();//匿名对象A(10,20);//匿名对象return0;}匿名对象的生命周期只到当前行为止。