【C++】C++对象初探及友元

C++对象初探及友元


文章目录

  • C++对象初探及友元
  • 前言
  • 一、C++对象初探
  • 二、this指针的使用
  • 三、空指针访问成员函数
  • 四、常函数和常对象
  • 五、全局函数做友元函数
  • 六、类作为友元类
  • 七、成员函数作为友元函数
  • 总结


前言

本篇文章将讲到C++对象初探,this指针的使用,空指针访问成员函数,常函数和常对象,全局函数做友元函数,类作为友元类,成员函数作为友元函数。


一、C++对象初探

类中的成员变量 和 成员函数 是分开存储的
只有非静态成员变量 属于类对象上
空类的sizeof结果 1

#define  _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;class Person
{
public:int m_A;  //只有非静态成员变量  属于类对象上void fun()  //成员函数  并不属于类对象上{}static int m_B; //静态成员变量  不属于类对象上static void func2()//静态成员函数  不属于类对象上{}double m_C;
};void test01()
{//空类的sizeof结果是1  原因  每个对象都应该在内存上有独一无二的地址,因此给空对象分配1个字节空间Person p1;//  空对象 大小 1cout << "sizeof = " << sizeof(p1) << endl;
}int main()
{test01();system("pause");return EXIT_SUCCESS;
}

二、this指针的使用

this指针 指向 被调用的成员函数 所属的对象
this指针可以解决名称冲突
this指针 隐式加在每个成员函数中
*this 就是本体
p1.personAddPerson(p2).personAddPerson(p2).personAddPerson(p2); //链式编程

#define  _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;class Person
{
public:Person(int age){//用途1 :解决名称冲突this->age = age;}//this指针 隐式加在每个成员函数中bool compareAge(Person& p){if (this->age == p.age){return true;}return false;}Person& personAddPerson(Person& p){this->age += p.age;return *this;  //*this 就是本体}int age;
};void test01()
{//this指针 指向 被调用的成员函数 所属的对象Person p1(10);cout << "p1的年龄为:" << p1.age << endl;Person p2(10);bool ret = p1.compareAge(p2);if (ret){cout << " p1与p2年龄相等 " << endl;}p1.personAddPerson(p2).personAddPerson(p2).personAddPerson(p2);  //链式编程cout << "p1的年龄为: " << p1.age << endl;
}int main() {test01();system("pause");return EXIT_SUCCESS;
}

三、空指针访问成员函数

如果成员函数中没有用到this指针,可以用空指针调用成员函数
如果成员函数中用到了this,那么这个this需要加判断,防止代码down掉

#define  _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;class Person
{
public:void showClass(){cout << "class Name is Person" << endl;}void showAge(){if (this == NULL){return;}m_Age = 0;cout << "age = " << this->m_Age << endl;}int m_Age;
};void test01()
{Person* p = NULL;//p->showClass();p->showAge();}int main() {test01();system("pause");return EXIT_SUCCESS;
}

四、常函数和常对象

常函数
成员函数 声明后面加const
void showPerson() const
const目的是为了修饰成员函数中的this指针,让指针指向的值不可以修改
有些属性比较特殊,依然在常函数或者常对象中可以修改,需要加入关键字 mutable
常对象
const Person p
常对象也不许修改成员属性
常对象只能调用常函数
对于成员函数 ,可不可以 用static 和 const同时修饰 ,不可以

#define  _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;class Person
{
public:Person(int age){this->m_Age = age;}//常函数 : 修饰成员函数中的 this指针,让指针指向的值不可以修改void showPerson() const{//m_Age = 100;m_A = 100;//this指针的本质: const Person * const this //this = NULL; //指针的指向不可以修改,而指针指向的值 可以改cout << "person age = " << this->m_Age << endl;}void func(){m_Age = 100;cout << "func调用" << endl;}int m_Age;mutable int m_A; //常函数中或常对象 有些特殊属性依然想修改,加入关键字 mutable
};void test01()
{//常对象const Person p1(10);//p1.m_Age = 10;p1.m_A = 10;p1.showPerson();//p1.func(); //常对象 只能调用常函数
}int main() {test01();system("pause");return EXIT_SUCCESS;
}

五、全局函数做友元函数

利用friend关键字让全局函数 goodGay作为本类好朋友,可以访问私有成员
friend void goodGay(Building * buliding);

#define  _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include <string>class Building
{friend void goodGay(Building& building);
public:Building(){this->m_SittingRoom = "客厅";this->m_BedRoom = "卧室";}
public:string m_SittingRoom;
private:string m_BedRoom;
};//好基友全局函数  可以访问Building的私有属性
void goodGay(Building& buliding)
{cout << "好基友正在访问:" << buliding.m_SittingRoom << endl;cout << "好基友正在访问:" << buliding.m_BedRoom << endl;
}void test01()
{Building buliding;goodGay(buliding);
}int main() {test01();system("pause");return EXIT_SUCCESS;
}

六、类作为友元类

让goodGay类作为 Building的好朋友,可以访问私有成员
friend class GoodGay;

#define  _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include <string>
class Building;
class GoodGay
{
public:GoodGay();void visit();Building* m_building;
};class Building
{//让goodGay类作为 Building的好朋友,可以访问私有成员friend class GoodGay;public:Building();string m_SittingRoom;private:string m_BedRoom;
};Building::Building()
{this->m_SittingRoom = "客厅";this->m_BedRoom = "卧室";
}GoodGay::GoodGay()
{this->m_building = new Building;
}
void GoodGay::visit()
{cout << "好基友正在访问: " << this->m_building->m_SittingRoom << endl;cout << "好基友正在访问: " << this->m_building->m_BedRoom << endl;
}void test01()
{GoodGay gg;gg.visit();
}int main() {test01();system("pause");return EXIT_SUCCESS;
}

七、成员函数作为友元函数

让GoodGay类中的 visit成员函数作为友元
friend void GoodGay::visit();

#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;
#include <string>
class Building;
class GoodGay
{
public:GoodGay();void visit(); //可以访问building的私有void visit2(); // 不可以访问building的私有Building* m_building;
};class Building
{//让GoodGay类中的 visit成员函数作为友元friend void GoodGay::visit();
public:Building();string m_SittingRoom;private:string m_BedRoom;
};Building::Building()
{this->m_SittingRoom = "客厅";this->m_BedRoom = "卧室";
}GoodGay::GoodGay()
{this->m_building = new Building;
}void GoodGay::visit()
{cout << "好基友正在访问: " << this->m_building->m_SittingRoom << endl;cout << "好基友正在访问: " << this->m_building->m_BedRoom << endl;
}void GoodGay::visit2()
{cout << "好基友正在访问: " << this->m_building->m_SittingRoom << endl;//cout << "好基友正在访问: " << this->m_building->m_BedRoom << endl;
}void test01()
{GoodGay gg;gg.visit();gg.visit2();
}int main() {test01();system("pause");return EXIT_SUCCESS;
}

总结

到这里这篇文章的内容就结束了,谢谢大家的观看,如果有好的建议可以留言喔,谢谢大家啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1555049.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

操作系统实验之银行算法

一、实验目的 采用高级语言编写一个动态分配系统资源的程序&#xff0c;模拟死锁现象&#xff0c;观察死锁发生的条件&#xff0c;并采用适当的算法&#xff0c;有效地防止死锁的发生。 二、实验内容 本次实验采用银行算法防止死锁的发生。设有3个并发进程共享10个系统资源。在…

无神论文解读之ControlNet:Adding Conditional Control to Text-to-Image Diffusion Models

一、什么是ControlNet ControlNet是一种能够控制模型生成内容的方法&#xff0c;能够对文生图等模型添加限制信息&#xff08;边缘、深度图、法向量图、姿势点图等&#xff09;&#xff0c;在当今生成比较火的时代很流行。 这种方法使得能够直接提供空间信息控制图片以更细粒…

AQS机制详解

案例一 public class AqsThread extends Thread {private Lock lock;public AqsThread(String name, Lock lock) {super(name);this.lock lock;}Overridepublic void run() {lock.lock();try {System.out.println(Thread.currentThread().getName() "running");} …

【LeetCode】每日一题 2024_10_5 完成旅途的最少时间(二分答案)

前言 每天和你一起刷 LeetCode 每日一题~ 大家国庆节快乐呀~ LeetCode 启动&#xff01; 突然发现&#xff0c;国庆的每日一题&#xff0c;不是坐公交就是坐火车&#xff0c;不是坐火车就是做飞机&#xff0c;这就是你的国庆旅游计划吗&#xff01;力扣&#xff01; 题目&a…

图表不会做怎么办?AI一键生成好看图表!

本期教你如何用AI一键生成各种数据图表&#xff01; 本文阅读难度&#xff1a;★☆☆☆☆ 看看别人做的这些图表&#xff0c;是不是挺好看的&#xff1f; 特别是作为接商单的新写手&#xff0c;看到这些&#xff0c;头都大了&#xff0c;该怎么办呢&#xff1f; 不用怕&…

ModuleNotFoundError: No module named ‘package‘

报错&#xff1a; Traceback (most recent call last): File “”, line 198, in run_module_as_main File “”, line 88, in run_code File "D:\python\helloworld.venv\Scripts\pip.exe_main.py", line 4, in File "D:\python\helloworld.venv\Lib\site-pac…

MAC备忘录空白解决方案

打开icloud->备忘录 取消勾选同步此MAC后再次勾选&#xff0c;然后点击完成即可。

S7-200 SMART的数据类型说明

S7-200 SMART的数据主要分为&#xff1a; 与实际输入/输出信号相关的输入/输出映象区&#xff1a; I&#xff1a;数字量输入&#xff08;DI&#xff09;Q&#xff1a;数字量输出&#xff08;DO&#xff09;AI&#xff1a;模拟量输入AQ&#xff1a;模拟量输出 内部数据存储区…

NVIDIA网卡系列之ConnectX-4规格信息(50G-PCIe 3.0x8-8PF256VF-2015年发布)

背景 NVIDIA ConnectX-4系列的网卡&#xff0c;早期还在Mellanox未被NVIDIA收购的时候就发布了&#xff0c;支持50G&#xff0c;PCIe3.0&#xff0c;最大x8通道lanes。 是50G级别的一代&#xff08;10G-CX3&#xff0c;50G-CX4&#xff0c;100G-CX5&#xff0c;200G-CX6&#…

基于Python的自然语言处理系列(24):BiDAF(双向注意力流)

在自然语言处理领域,机器阅读理解(Machine Comprehension, MC)是一个重要的任务。在这篇博文中,我们将实现论文 BiDAF 中提出的双向注意力流模型。BiDAF 主要改进了传统注意力机制中的早期信息摘要问题,并引入了字符嵌入来加强对单词细粒度信息的理解。 1. 加载 SQuAD 数据…

ThreadLocal底层原理及数据结构详解

ThreadLocal允许为每个线程创建独立的变量副本&#xff0c;使得同一个ThreadLocal对象在不同的线程中拥有不同的值。它的主要作用是在并发环境下提供线程隔离&#xff0c;避免多个线程共享同一个变量&#xff0c;从而减少线程间的相互干扰。 ThreadLocal的核心在于为每个线程维…

【案例】距离限制模型透明

开发平台&#xff1a;Unity 2023 开发工具&#xff1a;Unity ShaderGraph   一、效果展示 二、路线图 三、案例分析 核心思路&#xff1a;计算算式&#xff1a;透明值 实际距离 / 最大距离 &#xff08;实际距离 ≤ 最大距离&#xff09;   3.1 说明 | 改变 Alpha 值 在 …

【JAVA开源】基于Vue和SpringBoot的服装生产管理系统

本文项目编号 T 066 &#xff0c;文末自助获取源码 \color{red}{T066&#xff0c;文末自助获取源码} T066&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

git diff 查看到一行变动,但是目测无差异怎么办?

1. 目测无变化 直接用 git diff main.js 提示有一行变动&#xff0c;但是目测看不出来差异。 结果如图&#xff1a;up panel. 2. 大概是空格的问题&#xff0c;使用参数 --ws-error-highlightall $ git diff --ws-error-highlightall main.js结果如图: down panel.

黑神话:仙童,数据库自动反射魔法棒

黑神话&#xff1a;仙童&#xff0c;数据库自动反射魔法棒 Golang 通用代码生成器仙童发布了最新版本电音仙女尝鲜版十一及其介绍视频&#xff0c;视频请见&#xff1a;https://www.bilibili.com/video/BV1ET4wecEBk/ 此视频介绍了使用最新版的仙童代码生成器&#xff0c;将 …

Llama 3.2 微调指南

让我们通过微调 Llama 3.2 来找到一些精神上的平静。 我们需要安装 unsloth&#xff0c;以更小的尺寸实现 2 倍的快速训练 !pip install unsloth!pip uninstall unsloth -y && pip install --upgrade --no-cache-dir "unsloth[colab-new] githttps://github.co…

Spring Boot技术在大学生就业服务中的应用

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

视频格式批量转换:一键操作,轻松搞定

在处理大量视频文件时&#xff0c;格式转换是一个常见需求&#xff0c;不同的平台和设备对视频格式的要求各不相同&#xff0c;批量转换视频格式能显著提高工作效率。帮助大家轻松应对各种视频格式转换难题。 1.在“视频剪辑高手”的功能选项里切换到“批量转换视频”版块上 2.…

大学生就业服务:Spring Boot技术实践

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

C++结构体定义和创建

// // Created by 徐昌真 on 2024/10/5. // #include <iostream> using namespace std;int main() {//结构体的定义 struct 结构体名字 { 结构体成员名字 }struct Book{string name;double price;int value;}java; //java是创建的结构体//创建结构体//这是第一种方式Boo…