网站广告是内容营销吗,盐城市住房城乡建设网站,视频推广一条多少钱,做动态图片下载哪个网站好文章目录 一. 友元‘全局函数’作友元‘成员函数’作友元‘类‘作友元 内部类 一. 友元
何时会用到友元呢#xff1f;
当想让#xff08;类外面的某个函数/其它的类#xff09;访问 某个类里面的(私有或保护的)内容时#xff0c;可以选择使用友元。 友元提供了一种突破
当想让类外面的某个函数/其它的类访问 某个类里面的(私有或保护的)内容时可以选择使用友元。 友元提供了一种突破类访问限定符 封装的方式即在类外面也可以访问类里面的私有/保护成员。 友元的关键字friend 友元的声明通常位于类的声明中但其实现则位于类外部。 友元分为2种友元函数和友元类 友元函数是一种特殊的函数且它的声明是在类的内部但它并不是类的成员函数 还有一个注意点是只有类的静态成员或者静态成员函数才能直接用类名去访问。 class A
{
public:A(int a1):_a1(3){}int _a11;
};
int main()
{//这个是错误的std::cout A::_a1 std::endl;//这个是正确的A aa1(9);std::cout aa1._a1 std::endl;
}class A
{
public:A(int a2){}static int _a1;int _a2 9;
};static int _a1 8;//static成员在全局初始化int main()
{//静态成员函数可以用类名去访问std::cout A::_a1 std::endl;
}‘全局函数’作友元
(某个全局函数) 想要访问 (类A里的私有成员)直接访问的话编译器会报错。 办法我们可以告诉编译器这个全局函数是类A的好朋友它是可以访问类A的私有成员的可以放心不会出事儿。 措施在类的内部声明全局函数是友元 //类A
class A
{friend void quanjv(A a);public:A(int a1, int a2):_a1(a1), _a2(a2){}
private:int _a1;int _a2;
};
//全局函数
void quanjv(A a)
{std::cout a._a1 std::endl;
}int main()
{A a1(1, 2);quanjv(a1);return 0;
}‘成员函数’作友元
(B的成员函数)想要访问(A的私有成员 在A中声明友元函数告诉编译器,B的某个成员函数是A的友元函数可以访问A的私有成员。 class A
{friend void B::fang();
public:A(int a1):_a1(3){}
private:int _a11;
};
class B
{
public:B(int b1):_b1(3){}void fang(){A a1(9);std::cout a1._a1 std::endl;}private:int _b1 1;
};int main()
{B b1(8);b1.fang();return 0;
}
‘类‘作友元
在A类中声明友元函数,告诉编译器B类是A类的好朋友可以访问A类的私有成员
class A
{//告诉编译器类B是类A的好朋友B可以使用A的私有,保护成员friend class B;
public:A(int a1):_a1(3){}
private:int _a1 1;
};
class B
{
public:B(int b1):_b1(3){}void fang(){A a1(9);std::cout a1._a1 std::endl;}private:int _b1 1;
};int main()
{B b1(8);b1.fang();return 0;
}内部类
我们可以将其理解为嵌套即一个类里面嵌套了另一个类。在里面的那个类叫做内部类。
class A
{public:class B{}
}那什么时候考虑使用内部类呢 如果说类A的出现就是为了供类B使用那么可以将类A设置为B的内部类。如果将A 放在private/protected位置那么A类就是B类的专属内部类其他地方都用不了。
内部类的本质是封装。内部类是一个独立的类。跟定义在全局的类相比唯一不同的就是内部类受外部类的类域限制and访问限定符限制。内部类是外部类的友元。当计算外部类的大小sizeof时内部类不计算在其中。