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++常函数和常对象学习笔记相关推荐

  1. 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修饰成员函数 相关教 ...

  2. C++中的常函数和常对象

    函数后加个const,相当于告诉编译器,该函数不会改变成员变量的值 常函数: 返回值 函数名() const{//在普通成员函数后面加上const就是常成员函数} 注意: 只有普通成员函数才能构成常函 ...

  3. C++(常函数、常对象)

    常函数.常对象 首先明确: 常函数不能修改成员变量(可以调用,不能修改) 想要修改成员变量,必须在成员变量前加mutable关键字 常对象只能调用常函数,但是普通对象既可以调用普通函数也可以调用常函数 ...

  4. 常函数和常对象——c++

    文章目录 常函数和常对象 常函数 常对象 总结 常函数和常对象 常函数 this指针的本质:Person* const this 就是一个指针,const的含义就是他this指针不能更换指向的对象.但 ...

  5. c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...

    C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...

  6. C++语法(二十)常函数、常对象

    1.常函数 常函数无法修改成员变量,除非这个成员变量用mutable修饰了. #include <iostream> using namespace std;class Person{ p ...

  7. C++基础知识(常函数和常对象)

    1.常函数  void func()  const {}  常函数 2.常函数  修饰是 this指针  const Type * const this 3.常函数  不能修饰this指针指向的值 4 ...

  8. C++编程——常函数与常对象

    文章目录 常函数: 成员函数后加const后我们称为这个函数为常函数 常函数内不可以修改成员属性 成员属性声明时加关键字mutable后,在常函数中依然可以修改 常对象: 声明对象前加const称该对 ...

  9. C++中的常函数与常对象

    1.常函数 首先上代码: class Person { public:void showPerson() const//函数后面用const修饰了{m_Age = 20;cout << & ...

最新文章

  1. 清华博士的逆袭之路:从收到延毕警告到顶刊发文,我蛰伏了4年
  2. 环信联合创始人: Saas敏捷开发实践!
  3. 团队实践,我们是怎么用敏捷开发工具Leangoo的
  4. golang中的collection
  5. Windows 7 应用程序崩溃恢复
  6. android第一次作业
  7. .net session 有效时间_Python中requests模拟登录的三种方式(携带cookie/session进行请求网站)...
  8. python 生意参谋_GitHub - iOSDevLog/sycm: 生意参谋
  9. git 上传项目到linux仓库_使用子模块和子树来管理 Git 项目 | Linux 中国
  10. MySQL 8.0 ROLE管理
  11. 微机原理换行代码_微机原理
  12. 一个CPU核可以设计为两个以上的线程
  13. 【文献阅读笔记】(2):使用IMPUTES2和minimac软件完成群体特异性的基因型填充(Imputation)
  14. Vs2010 破解 序列号
  15. 测评绿联蓝牙音频接收器
  16. 智能聊天机器人的技术综述
  17. excel英文大小写转换
  18. 第七周 项目2 - 建立链队算法库
  19. 采样频率,采样率,转换速率
  20. sdk 今日头条_今日头条大数据分析平台艰辛成长路

热门文章

  1. JavaScript:双波浪号“~~“ 与 Math.floor()
  2. ModaHub魔搭社区:阿里云CTO周靖人:魔搭社区将成为中国最大的“大模型自由市场”
  3. sensors参考文献
  4. 第十二章 卷积神经网络实战--猫狗识别
  5. 有容乃大 -- Java 集合(List/Set/Map)
  6. 商城之Fresco(FaceBook)
  7. 龙蜥开发者说:海纳百川,有容乃大,我在龙蜥社区的升级之旅 | 第 11 期
  8. 以题理解经典面试题——三六九等的事件环
  9. 图神经网络(10)- relational GCN
  10. 侠客岛--多线程系列之线程池(十二)