




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第C++类与对象深入之静态成员与友元及内部类详解目录一:静态成员1.1:静态成员分类1.2:静态成员变量1.3:静态成员函数1.4:总结特性1.5:试题示例1.6:C++11成员初始化新玩法二:友元2.1:全局函数做友元2.2:类做友元2.3:成员函数做友元三:内部类3.1:概念3.2:特性
一:静态成员
静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员。C++里面尽量用静态成员变量代替全局变量。
1.1:静态成员分类
1️静态成员变量:
所有对象共享同一份数据在编译阶段分配内存类内声明,类外初始化
静态成员函数
所有对象共享同一个函数静态成员函数只能访问静态成员变量
1.2:静态成员变量
classPerson
public:
staticintm_A;//静态成员变量
private:
staticintm_B;//静态成员变量也是有访问权限的
intPerson::m_A=10;
intPerson::m_B=10;
voidtest01()
//静态成员变量两种访问方式
//1、通过对象
Personp1;
p1.m_A=100;
cout"p1.m_A="p1.m_Aendl;
Personp2;
p2.m_A=200;
cout"p1.m_A="p1.m_Aendl;//共享同一份数据
cout"p2.m_A="p2.m_Aendl;
//2、通过类名
cout"m_A="Person::m_Aendl;
//cout"m_B="Person::m_Bendl;//私有权限访问不到
intmain(){
test01();
system("pause");
return0;
代码解释:上述代码我们主要验证了利用两种方式来访问静态成员变量,以及静态成员变量属于整个类,属于类的所有对象
1.3:静态成员函数
classPerson
public:
staticvoidfunc()
cout"func调用"endl;
m_A=100;
//m_B=100;//错误,不可以访问非静态成员变量
staticintm_A;//静态成员变量
intm_B;//
private:
//静态成员函数也是有访问权限的
staticvoidfunc2()
cout"func2调用"endl;
intPerson::m_A=10;
voidtest01()
//静态成员变量两种访问方式
//1、通过对象
Personp1;
p1.func();
//2、通过类名
Person::func();
//Person::func2();//私有权限访问不到
intmain(){
test01();
system("pause");
return0;
}
代码解释:上述代码我们主要验证了利用两种方式来访问静态成员函数,利用对象访问和利用类名访问,以及静态成员函数只可以访问静态成员变量
⚠️⚠️⚠️:为什么不可以访问非静态成员?
⭐️因为没有this指针
1.4:总结特性
静态成员为所有类对象所共享,不属于某个具体的类实例静态成员变量必须在类外定义,定义时不加static关键字类静态成员类名::静态成员或者对象.静态成员来访问静态成员函数没有隐含的this指针,不可以访问任何非静态成员静态成员和类的普通成员也一样,也有三种访问权限,也可以有返回值。
1.5:试题示例
❓实现一个类,计算程序中创建了多少个类对象
classA
public:
A(){
++_count1;
A(constAaa){
++_count2;
//成员函数也可以是静态,static成员函数没有this指针
staticintGetCount1(){
return_count1;
staticintGetCount2(){
return_count2;
//private:
//静态成员变量属于整个类,所以类的所有对象
staticint_count1;
staticint_count2;//声明
//定义
intA::_count1=0;
intA::_count2=0;
AFunc(Aa)
Acopy(a);
returncopy;
intmain()
Aa1;
Aa2=Func(a1);
couta1._count1endl;
couta2._count1endl;
couta1._count2endl;
couta2._count2endl;
coutA::_count1endl;
coutA::_count2endl;
couta1.GetCount1()endl;
couta2.GetCount2()endl;
coutA::GetCount1()endl;
coutA::GetCount2()endl;
system("pause");
return0;
1
1
3
3
1
3
1
3
1
3
请按任意键继续...
1.6:C++11成员初始化新玩法
classB
public:
B(intb=0)
:_b(b)
int_b;
classA
public:
//A()//其实是编译器自己生产的默认构造函数用缺省值初始化
//:a(10)
//,b(20)
//,p((int*)malloc(4))
//{}
voidPrint()
coutaendl;
coutb._bendl;
coutpendl;
coutnendl;
private:
//非静态成员变量,可以在成员声明时给缺省值。
inta=10;
Bb=20;//单参数的构造函数,支持隐式类型的转换
int*p=(int*)malloc(4);
staticintn;
//非静态成员变量定义在构造函数
//静态在类外
intA::n=0;
intmain()
Aa;
a.Print();
system("pause");
return0;
}
二:友元
在程序里,有些私有属性也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术
友元的目的就是让一个函数或者类访问另一个类中私有成员
友元的关键字为friend
友元分为:
友元函数友元类
友元的三种实现:
全局函数做友元
类做友元
成员函数做友元
2.1:全局函数做友元
⭐️说明:友元函数可以直接访问类的私有成员,它是定义在类外部的普通成员函数,不属于任何类,但需要在类的内部声明,声明的时候需要加friend关键字。
classBuilding
//告诉编译器goodGay全局函数是Building类的好朋友,可以访问类中的私有内容
friendvoidgoodGay(Building*building);
public:
Building(){
this-m_SittingRoom="客厅";
this-m_BedRoom="卧室";
public:
stringm_SittingRoom;//客厅
private:
stringm_BedRoom;//卧室
voidgoodGay(Building*building){
cout"好基友正在访问:"building-m_SittingRoomendl;
cout"好基友正在访问:"building-m_BedRoomendl;
voidtest01(){
Buildingb;
goodGay(
intmain(){
test01();
system("pause");
return0;
}
代码解释:如上述代码中,我们需要告诉编译器goodGay全局函数是Building类的好朋友,可以访问类中的私有内容
2.2:类做友元
友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类的非公有成员。
友元关系是单向的,不具有交换性。友元关系不可以传递。如果B是A的友元,C是B的友元,但是不可以说C是A的友元。
代码示例:
classBuilding;
classgoodGay
public:
goodGay();
voidvisit();
private:
Building*building;
classBuilding
//告诉编译器goodGay类是Building类的好朋友,可以访问到Building类中私有内容
friendclassgoodGay;
public:
Building();
public:
stringm_SittingRoom;//客厅
private:
stringm_BedRoom;//卧室
Building::Building(){
this-m_SittingRoom="客厅";
this-m_BedRoom="卧室";
goodGay::goodGay(){
building=newBuilding;
voidgoodGay::visit(){
cout"好基友正在访问"building-m_SittingRoomendl;
cout"好基友正在访问"building-m_BedRoomendl;
voidtest01(){
goodGaygg;
gg.visit();
intmain(){
test01();
system("pause");
return0;
}
代码解释:如上述代码中,我们需要告诉编译器告诉编译器goodGay类是Building类的好朋友,可以访问到Building类中私有内容
2.3:成员函数做友元
一个类的成员函数做另一个类的友元。
代码示例:
classBuilding;//提前声明
classgoodGay
public:
goodGay();
voidvisit();//只让visit函数作为Building的好朋友,可以发访问Building中私有内容
voidvisit2();
private:
Building*building;
classBuilding
//告诉编译器goodGay类中的visit成员函数是Building好朋友,可以访问私有内容
friendvoidgoodGay::visit();
public:
Building();
public:
stringm_SittingRoom;//客厅
private:
stringm_BedRoom;//卧室
Building::Building(){
this-m_SittingRoom="客厅";
this-m_BedRoom="卧室";
goodGay::goodGay(){
building=newBuilding;
voidgoodGay::visit(){
cout"好基友正在访问"building-m_SittingRoomendl;
cout"好基友正在访问"building-m_BedRoomendl;
voidgoodGay::visit2(){
cout"好基友正在访问"building-m_SittingRoomendl;
//cout"好基友正在访问"building-m_BedRoomendl;
voidtest01(){
goodGaygg;
gg.visit();
intmain(){
test01();
system("pause");
return0;
}
代码解释:如上述代码中,我们需要告诉编译器goodGay类中的visit成员函数是Building好朋友,可以访问私有内容
三:内部类
3.1:概念
概念:如果一个类定义在另一个类的内部,这个类就叫内部类。注意此时的内部类是一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 天津市五区县重点校联考2024-2025学年高二下学期4月期中考试 化学试题(原卷版+解析版)
- 路灯安装工程承包协议
- 汽车行业二手车交易质保合同
- 车工基础知识试题及答案
- 浙江国企招聘2025湖州安吉国丰热电有限公司招聘57人笔试参考题库附带答案详解
- 2025重庆广播电视集团(总台)招聘11人笔试参考题库附带答案详解
- 2025福建福清市汇融创业投资集团有限公司(第一次)招聘8人笔试参考题库附带答案详解
- 2025湖南双新食品招28人笔试参考题库附带答案详解
- 2025年福建省晋江新丝路康养产业有限公司招聘6人笔试参考题库附带答案详解
- 2025年山东省科创集团有限公司权属企业招聘(12人)笔试参考题库附带答案详解
- 许昌职业技术学院教师招聘考试历年真题
- 六年级下册第四单元复习教学设计
- DLT-969-2023年变电站运行导则
- 临床微生物学检验技术-苏州大学中国大学mooc课后章节答案期末考试题库2023年
- 人教版小学三年级数学下册面积练习
- 2023年湖南省长沙市中考语文真题试卷【含答案】
- 2022北京西城区初一期末(下)道法试卷及答案
- 水下光学探测发展综述
- 2023年护理考试-护理学(副高)历年考试真题试卷摘选答案
- 12315投诉举报电话文明用语
- GB/T 2410-2008透明塑料透光率和雾度的测定
评论
0/150
提交评论