C++常函数和常对象学习笔记
C++常函数和常对象学习笔记
- 一、友元的概述
- 二、友元的语法
- 三、友元类
- 3.1 通过传入参数来访问类的私有成员
- 3.2 通过类内指针来访问类的私有成员
- 四、类的友元成员函数
- 五、友元类的注意
一、友元的概述
类的主要特点之一是数据隐藏,也就是类的私有成员没办法在类的外部访问,但是有时候需要在类的外部访问类的私有成员
解决方法是使用友元函数,C++允许友元函数访问类的私有成员,程序员可以把一个全局函数、某一个类中的成员函数、甚至整个类声明为友元
二、友元的语法
- friend关键字只出现在声明处
- 其他类、类成员函数、全局函数都可以声明为友元
- 友元函数不是类的成员,没有this指针
- 友元函数可以访问对象任意成员属性,包括私有属性
全局友元函数示例:
#include<iostream>
using namespace std;class Maker {// 声明这个全局函数为该类的友元函数 但是不作为该类的成员函数friend void Good(Maker& m);public:Maker(){keting = "客厅";woshi = "卧室";}public:string keting;private:string woshi;
};void Good(Maker& m)
{cout << "好朋友访问" << m.keting << endl;cout << "好朋友访问" << m.woshi << endl;
}void test01()
{Maker m;Good(m);
}int main()
{test01();return EXIT_SUCCESS;
}
三、友元类
3.1 通过传入参数来访问类的私有成员
如果A类需要调用B类的私有成员,那么就需要在B类将A类声明为他的友元类:friend class A
#include<iostream>
using namespace std;class Maker {// 声明这个全局函数为该类的友元函数 但是不作为该类的成员函数friend void Good(Maker& m);friend class GoodF;// 声明GoodF是友元类public:Maker(){keting = "客厅";woshi = "卧室";}public:string keting;private:string woshi;
};class GoodF {public:void func(Maker& bd){cout << "访问:" << bd.keting << endl;cout << "访问:" << bd.woshi << endl;// 访问类的私有成员}};void Good(Maker& m)
{cout << "好朋友访问" << m.keting << endl;cout << "好朋友访问" << m.woshi << endl;
}void test01()
{Maker m;Good(m);
}void test02()
{Maker m;GoodF f;f.func(m);
}int main()
{test02();return EXIT_SUCCESS;
}
3.2 通过类内指针来访问类的私有成员
#include<iostream>
#include<string>
using namespace std;class Maker {friend class GoodF2;// 声明为友元类public:Maker(){keting = "客厅";woshi = "卧室";}public:string keting;private:string woshi;
};class GoodF2 {public:GoodF2(){p = new Maker;// 申请堆区空间}// 通过对象指针 访问私有成员void func(){cout << "访问:" << p->keting << endl;cout << "访问:" << p->woshi << endl;// 访问类的私有成员}// 拷贝构造 防止浅复制GoodF2(const GoodF2& f2){// 申请空间p = new Maker;// 已经初始化}~GoodF2(){if (p != NULL){// 释放空间delete p;}}public:Maker* p;};
void test02()
{GoodF2 f;f.func();GoodF2 f2 = f;// 调用拷贝构造
}int main()
{test02();return EXIT_SUCCESS;
}
四、类的友元成员函数
类的成员函数成为另一个类的友元函数,不建议,直接将该类声明为另一个类的友元
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<string>// 编译器知道类的声明 不知道类的结构class Building;// 声明Building class Building
{// 声明该类为Building 的友元类//friend class GoodF;// 声明GoodGay类的成员函数func成为Building类的友元函数friend void GoodF::func(Building &bud);public:Building(){keting = "客厅";woshi = "卧室";}public:string keting;private:string woshi;
};class GoodF
{public:void func(Building& bd);};// 实现 加上作用域
void GoodF::func(Building& bd)
{cout << bd.keting << endl;cout << bd.woshi << endl;// 会报错
}void test01()
{Building b;GoodF f;f.func(b);
}int main()
{test01();return EXIT_SUCCESS;
}
五、友元类的注意
- 友元关系不能被继承
- 友元关系是单向的,类A是类B的朋友,但是类B不一定是类A的朋友
- 友元关系不具有传递性,类B是类A的朋友,类C是类B的朋友,但是类C不一定是类A的朋友
C++常函数和常对象学习笔记相关推荐
- c/c++教程 - 2.4.3 this指针作用,链式编程思想,空指针访问成员函数,const修饰成员函数,常函数,常对象
目录 4.3 C++对象模型和this指针 4.3.1 成员变量和成员函数分开存储 4.3.2 this指针概念(非常重要) 4.3.3 空指针访问成员函数 4.3.4 const修饰成员函数 相关教 ...
- C++中的常函数和常对象
函数后加个const,相当于告诉编译器,该函数不会改变成员变量的值 常函数: 返回值 函数名() const{//在普通成员函数后面加上const就是常成员函数} 注意: 只有普通成员函数才能构成常函 ...
- C++(常函数、常对象)
常函数.常对象 首先明确: 常函数不能修改成员变量(可以调用,不能修改) 想要修改成员变量,必须在成员变量前加mutable关键字 常对象只能调用常函数,但是普通对象既可以调用普通函数也可以调用常函数 ...
- 常函数和常对象——c++
文章目录 常函数和常对象 常函数 常对象 总结 常函数和常对象 常函数 this指针的本质:Person* const this 就是一个指针,const的含义就是他this指针不能更换指向的对象.但 ...
- c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...
C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...
- C++语法(二十)常函数、常对象
1.常函数 常函数无法修改成员变量,除非这个成员变量用mutable修饰了. #include <iostream> using namespace std;class Person{ p ...
- C++基础知识(常函数和常对象)
1.常函数 void func() const {} 常函数 2.常函数 修饰是 this指针 const Type * const this 3.常函数 不能修饰this指针指向的值 4 ...
- C++编程——常函数与常对象
文章目录 常函数: 成员函数后加const后我们称为这个函数为常函数 常函数内不可以修改成员属性 成员属性声明时加关键字mutable后,在常函数中依然可以修改 常对象: 声明对象前加const称该对 ...
- C++中的常函数与常对象
1.常函数 首先上代码: class Person { public:void showPerson() const//函数后面用const修饰了{m_Age = 20;cout << & ...
最新文章
- 清华博士的逆袭之路:从收到延毕警告到顶刊发文,我蛰伏了4年
- 环信联合创始人: Saas敏捷开发实践!
- 团队实践,我们是怎么用敏捷开发工具Leangoo的
- golang中的collection
- Windows 7 应用程序崩溃恢复
- android第一次作业
- .net session 有效时间_Python中requests模拟登录的三种方式(携带cookie/session进行请求网站)...
- python 生意参谋_GitHub - iOSDevLog/sycm: 生意参谋
- git 上传项目到linux仓库_使用子模块和子树来管理 Git 项目 | Linux 中国
- MySQL 8.0 ROLE管理
- 微机原理换行代码_微机原理
- 一个CPU核可以设计为两个以上的线程
- 【文献阅读笔记】(2):使用IMPUTES2和minimac软件完成群体特异性的基因型填充(Imputation)
- Vs2010 破解 序列号
- 测评绿联蓝牙音频接收器
- 智能聊天机器人的技术综述
- excel英文大小写转换
- 第七周 项目2 - 建立链队算法库
- 采样频率,采样率,转换速率
- sdk 今日头条_今日头条大数据分析平台艰辛成长路
热门文章
- JavaScript:双波浪号“~~“ 与 Math.floor()
- ModaHub魔搭社区:阿里云CTO周靖人:魔搭社区将成为中国最大的“大模型自由市场”
- sensors参考文献
- 第十二章 卷积神经网络实战--猫狗识别
- 有容乃大 -- Java 集合(List/Set/Map)
- 商城之Fresco(FaceBook)
- 龙蜥开发者说:海纳百川,有容乃大,我在龙蜥社区的升级之旅 | 第 11 期
- 以题理解经典面试题——三六九等的事件环
- 图神经网络(10)- relational GCN
- 侠客岛--多线程系列之线程池(十二)