网站设计哪家更好,定制网站建设与运营案例,手机wap网站开发,电话销售如何快速吸引客户前言#xff1a;前面我们说到类和对象是一个十分漫长的荆棘地#xff0c;今天我们将走到终点#xff0c;也就是说我们对于#xff23;算是正式的入门了。 #x1f496; 博主CSDN主页:卫卫卫的个人主页 #x1f49e; #x1f449; 专栏分类:高质量#xff23;学习 …前言前面我们说到类和对象是一个十分漫长的荆棘地今天我们将走到终点也就是说我们对于算是正式的入门了。 博主CSDN主页:卫卫卫的个人主页 专栏分类:高质量学习 代码仓库:卫卫周大胖的学习日记 关注博主和博主一起学习!一起努力 目录标题 类和对象友元内部类通过外部类使用内部类内部类是外部类的友元外部类无法直接访问内部类的成员 匿名对象 类和对象
友元
友元是 C 中的一个特殊声明允许一个类或函数访问另一个类的私有成员或受保护成员。友元的声明可以在类中出现也可以在类外出现。
友元关系是单向的不具有交换性。友元关系不能传递如果C是B的友元 B是A的友元则不能说明C时A的友元。友元关系不能继承在继承位置再给大家详细介绍。
友元函数 友元函数是在类外部声明的函数它可以直接访问类的私有成员或受保护成员。在类中声明一个函数为友元函数需要使用 friend 关键字。 友元类 友元类是在一个类中声明的另一个类被声明为友元类的类可以访问该类的私有成员或受保护成员。在类中声明一个类为友元类需要使用 friend 关键字
class A {
private:int x;
public:friend class B; // 声明类 B 是类 A 的友元friend void func(); // 声明函数 func 是类 A 的友元A(int n 10){x n;}
};class B {
public:void printA(A obj) {cout 友元类访问私有成员: obj.x endl; // 类 B 可以访问类 A 的私有成员 x}
};void func() {A obj(1);cout func函数访问的私有成员: obj.x endl; // 函数 func 可以访问类 A 的私有成员 x
}int main()
{A obj(5);func();//友元函数可以访问类中的私有成员B obj1;obj1.printA(obj);//类 B 可以访问类 A 的私有成员 xreturn 0;
}友元关系是单向的即如果类 A 是类 B 的友元不代表类 B 是类 A 的友元需要分别进行声明。
注意过度使用友元会破坏封装性并增加代码的复杂性和耦合性因此在使用友元时应慎重考虑。 内部类
概念如果一个类定义在另一个类的内部这个内部类就叫做内部类。内部类是一个独立的类它不属于外部类更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限。 注意内部类就是外部类的友元类参见友元类的定义内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。
通过外部类使用内部类
在下面的示例中Inner是一个内部类Outer是一个外部类. 实例演示:
class Outer
{
public :Outer(int s 1, int q 1):m(s),n(q){}void Print(){cout 你好我是外部类 : m n endl;}class Inner{public:Inner(int n 1, int m 1):x(n),y(m){}void Print(){cout 你好我是内部类 : x y endl;}private :int x;int y;};
private :int m;int n;
};int main()
{Outer outobj(9, 22);Outer::Inner inobj(10,20);//外部使用内部类inobj.Print();outobj.Print();return 0;
}内部类是外部类的友元
实例演示
外部类无法直接访问内部类的成员
实例演示 总结 C中的内部类指的是在一个类的内部定义的类。内部类具有以下特点 内部类是一个嵌套在外部类中的类它们之间可以互相访问彼此的成员。 内部类可以访问外部类的所有成员包括私有成员。 内部类的对象可以在外部类的成员函数中直接创建。 内部类的作用域被限定在外部类中外部类的成员函数可以访问内部类但外部类的对象不能直接访问内部类。 内部类可以使用外部类的成员作为自己的成员从而实现更灵活的设计和封装。 内部类可以被声明为私有这样只有外部类的成员函数可以访问它。 内部类的声明可以在外部类的定义之外但定义必须在外部类的定义之内。 . sizeof(外部类)外部类和内部类没有任何关系。 匿名对象
C中的匿名对象是指没有被命名的对象它们在创建后可以直接使用但无法通过变量名来引用。匿名对象通常用于简单的一次性操作或者作为函数的参数。 匿名对象的特点如下
匿名对象在创建后立即执行相关操作并在表达式结束后被销毁。匿名对象无法被引用因此无法在其他地方被使用。匿名对象适用于一些临时的、不需要保留状态的操作如简单的计算或调用函数。 实例演示1
class Myclass
{
public:Myclass(int year 2024, int month 1, int day 1):_year(year),_month(month),_day(day){}void Print(){cout year: _year month: _month day: _day endl;}
private:int _year;int _month;int _day;
};
int main()
{Myclass(2024, 2, 16).Print();//调用匿名对象Myclass A 2023;//这里会产生隐式转换A.Print();Myclass B;调用一次构造函数B.Print();B Myclass(2003, 9, 22);//此处等价于赋值且这个匿名对象会调用一次给构造函数B.Print();return 0;
}匿名对象在以下情况下会调用拷贝构造、默认构造和析构函数 如果生成的匿名对象在外部有对象等待被其实例化此匿名对象的生命周期就变成了外部对象的生命周期如果生成的匿名对象在外面没有对象等待被其实例化此匿名对象将会生成之后立马被析构。 好啦今天的内容就到这里啦下期内容预告类和对象(五)友元、内部类、匿名对象等下期就会对类和对象进行最后的收尾了各位加油呐 好啦今天的内容就到这里啦下期内容预告C/C内存管理类和对象就在这里和大家告一段落了各位加油呐 结语今天的内容就到这里吧谢谢各位的观看如果有讲的不好的地方也请各位多多指出作者每一条评论都会读的谢谢各位。 ️ 这里祝各位新年快乐