类和对象(3)——最终篇
一、static成员
在C语言的学习中,我们就已经见识过这个关键字了,一般的程序的代码储存在栈中,而static修饰的代码放在静态区中。现在,我们的static可以修饰类中的成员变量,会发生怎样的变化呢?
1.1概念
声明为static的类成员称为类的静态成员,用static修饰的成员变量,称之为静态成员变量;
用static修饰的成员函数,称之为静态成员函数。
1.2特性
1.静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区
2.静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明:
3. 类静态成员即可用 [类名::静态成员] 或者 [对象.静态成员] 来访问,前提是该静态成员公有:
但为了类的封装性,访问私有静态成员时仍使用函数接口访问:4. 静态成员也是类的成员,受public、protected、private 访问限定符的限制。
5. 静态成员函数没有隐藏的this指针,不能访问任何非静态成员:
二、友元
友元提供了一种突破封装的方式,有时提供了便利。
但是友元会增加耦合度,破坏了封装,所以友元不宜多用。
友元分为友元类和友元函数。
2.1友元类
假设我们要设置两个类,TV电视机和Remote遥控器,我们想操控电视机的频道、声音等数据,我们直接在TV类中设置类似函数好像不合情理,而在Remote类中设置就正常多了,但是TV类中的都是私有数据,Remote类怎么能打破这一特性呢?答案是使用友元类。
友元类的特性:
1.友元关系是单向的,不具有交换性。(电视无法操纵遥控器)
2.友元关系不能传递,如果C是B的友元, B是A的友元,则不能说明C时A的友元。(遥控器是电视的友元,插座也是电视的友元,但是遥控器不能操控插座,反之亦然)
3.友元关系不能继承。(同一个遥控器能操控一代电视,但不能操控二代电视)
2.2友元函数
友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明时需要加friend关键字。
1.友元函数可访问类的私有和保护成员,但不是类的成员函数
2.友元函数不能用const修饰
3.友元函数可以在类定义的任何地方声明,不受类访问限定符限制
2.3内部类
概念:
如果一个类定义在另一个类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。外部类对内部类没有任何优越的访问权限
注意:
内部类就是外部类的友元类,内部类可以通过外部类的对象参数来访问外部类中的所有成员。但是外部类不是内部类的友元。
特性:
1. 内部类可以定义在外部类的public、protected、private。
2. 注意内部类可以直接访问外部类中的static成员,不需要外部类的对象/类名。
3. sizeof(外部类)=外部类,和内部类没有任何关系。
三、匿名对象
语法:[类名()]
特性:其生命周期只有一行,下一行时就会自动调用析构函数。
希望大家从下面的代码与其执行结果中看出匿名对象的生命周期:
class Date
{
public:
Date(int year = 2024, int month = 2, int day = 29)
:_year(year),
_month(month),
_day(day)
{
cout << "Hi:";
PrintDate();
}
void PrintDate()
{
cout << _year << "." << _month << "." << _day << endl;
}
~Date()
{
cout << "Bye~:";
PrintDate();
}
private:
int _year = 2024;
int _month = 2;
int _day = 29;
};
int main()
{
Date();
Date d1(2024, 3, 1);
Date d2(2024, 3, 2);
return 0;
}
运行结果:
原文地址:https://blog.csdn.net/m0_75186846/article/details/136393896
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!