C++ Day04 this指针,友元函数,重载
this指针
概念
特点
#include <iostream>
#include <cstring>
using namespace std;
class Stu{
private:char name[50];char sex[10];int age;
public:Stu(){}Stu(char *n,char *s,int a):age(a){strcpy(name,n);strcpy(sex,s);}void test01(){//以下两句代码效果相同//证明本类函数中调用本类成员默认使用this关键字cout << this->name << endl;cout << name << endl;}static void test02(){//报错,因为静态函数中没有this//cout << name << endl;}
};
int main(int argc, char *argv[])
{Stu s("张三","男",18);s.test01();s.test02();return 0;
}
使用场景
#include <iostream>
#include <cstring>
using namespace std;
class Stu{
private:char name[50];char sex[10];int age;
public:Stu(){}Stu(char *name,char *sex,int age){//当局部变量与成员变量重名,使用this区分strcpy(this->name,name);strcpy(this->sex,sex);this->age = age;}void print_info(){//调用本类成员变量cout << this->name << endl;cout << this->sex << endl;cout << this->age << endl;}void test(){//调用本类成员函数this->print_info();}
};
int main(int argc, char *argv[])
{Stu s("张三","男",18);s.print_info();s.test();return 0;
}
实例
#include <iostream>
#include <cstring>
using namespace std;
class Stu{
private:char name[50];char sex[10];int age;
public:Stu(){}Stu(char *name,char *sex,int age){strcpy(this->name,name);strcpy(this->sex,sex);this->age = age;}void print_info(){cout << this->name << endl;cout << this->sex << endl;cout << this->age << endl;}Stu& eat(char *foodName){cout << name << "吃" << foodName << endl;return *this;}
};
int main(int argc, char *argv[])
{Stu s("张三","男",18);s.eat("凉皮").eat("肉夹馍").eat("甑糕");return 0;
} const修饰成员函数(了解)
特点
实例
class Stu{
private:char name[50];char sex[10];int age;mutable int score;
public:Stu(){}Stu(char *name,char *sex,int age){strcpy(this->name,name);strcpy(this->sex,sex);this->age = age;}void print_info(){cout << this->name << endl;cout << this->sex << endl;cout << this->age << endl;}Stu& eat(char *foodName){cout << name << "吃" << foodName << endl;return *this;}void test() const{//age = 10;//错误score = 99;//正确}
};
友元函数(重要)
概述
全局友元函数
特点
步骤
示例
#include <iostream>
#include <cstring>
using namespace std;
class Stu{
friend void test(Stu &stu);
private:char name[50];char sex[10];int age;
public:Stu(){}Stu(char *name,char *sex,int age){strcpy(this->name,name);strcpy(this->sex,sex);this->age = age;}void print_info(){cout << this->name << endl;cout << this->sex << endl;cout << this->age << endl;}
private:void eat(char *foodName){cout << name << "吃" << foodName << endl;}
};
void test(Stu& stu)
{
//调用友元类的私有属性cout << stu.name << endl;cout << stu.sex << endl;cout << stu.age << endl;
//调用友元类的私有函数stu.eat("大嘴巴子");
}
int main(int argc, char *argv[])
{Stu s("张三","男",18);test(s);return 0;
}
成员友元函数
特点
注意
步骤
示例
#include <iostream>
#include <cstring>
using namespace std;
//定义B类,但是没有实现
class B;
class A{
public:void test(B& b);
};
class B{
friend void A::test(B& b);
private:int a;
public:B(int a){this->a = a;}
private:void print_B(){cout << "a = " << a << endl;}
};
void A::test(B& b){cout << b.a << endl;b.print_B();}
int main(int argc, char *argv[])
{A a;B b(10);a.test(b);return 0;
}
整个类作为友元函数
特点
步骤
示例
#include <iostream>
#include <cstring>
using namespace std;
//定义B类,但是没有实现
class B;
class A{
public:void test01(B& b);void test02(B& b);
};
class B{
friend class A;
private:int a;
public:B(int a){this->a = a;}
private:void print_B(){cout << "a = " << a << endl;}
};
void A::test01(B& b)
{cout << "test01" << endl;cout << b.a << endl;b.print_B();
}
void A::test02(B& b)
{cout << "test02" << endl;cout << b.a << endl;b.print_B();
}
int main(int argc, char *argv[])
{A a;B b(10);a.test01(b);cout << "--------------------" << endl;a.test02(b);return 0;
}
注意
实例
说明
代码
#include <iostream>
#include <cstring>
using namespace std;
class TV;
class YK{
public:void up(TV& tv);void down(TV& tv);
};
class TV{
friend class YK;
private:int yl;
public:TV(){}TV(int yl){this->yl = yl;}
};
void YK::up(TV &tv)
{tv.yl++;cout << "当前音量:" << tv.yl << endl;
}
void YK::down(TV &tv)
{tv.yl--;cout << "当前音量:" << tv.yl << endl;
}
int main(int argc, char *argv[])
{TV tv(10);YK yk;yk.up(tv);yk.up(tv);yk.up(tv);yk.down(tv);yk.down(tv);yk.down(tv);return 0;
}
string
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string str01 = "hello";
string str02 = str01;//字符串赋值
cout << str01 << endl;//字符串输出
cout << str02 << endl;
str02 = "world";
cout << str01 << endl;
cout << str02 << endl;
string str03 = str01 + str02;//字符串拼接
cout << str03 << endl;
string str04;
cin >> str04;//字符串输入
cout << str04 << endl;
string str05 = "Hi C++";
string str06 = "Hi C++";
string str07 = "Hi C";
cout << (str05 == str06) << endl;//判断字符串内容是否相同
cout << (str05 == str07) << endl;
cout << &str05 << endl;//打印str05地址
cout << &str06 << endl;//打印str06地址
return 0;
}
重载
引入
概述
作用
关键字
operator
语法
示例1:重载<<,>>运算符
#include <iostream>
#include <cstring>
using namespace std;
class Data{
public:int x,y,z;Data(){}Data(int a,int b,int c):x(a),y(b),z(c){}
};
//第一个参数为运算符左边的变量
//第二个参数为运算符右边的变量
istream& operator >>(istream& in,Data& d)
{in >> d.x >> d.y >> d.z;return in;
}
ostream& operator <<(ostream& out,Data& d)
{out << "x = " << d.x << "\ty = " << d.y << "\tz = " << d.z << endl;return out;
}
int main(int argc, char *argv[])
{Data d;cin >> d;cout << d << endl;return 0;
}
示例2:重载+运算符
效果
分析
示例:全局函数重载
#include <iostream>
using namespace std;
class Data{
public:int x,y,z;Data(){}Data(int a,int b,int c):x(a),y(b),z(c){}
};
//第一个参数为运算符左边的变量
//第二个参数为运算符右边的变量
Data* operator +(Data& d1,Data& d2)
{Data *d = new Data();d->x = d1.x + d2.x;d->y = d1.y + d2.y;d->z = d1.z + d2.z;return d;
}
int main(int argc, char *argv[])
{Data d1(1,2,3);Data d2(1,2,3);Data* d3 = d1 + d2;cout << d3->x << d3->y << d3->z << endl;return 0;
}
#include <iostream>
using namespace std;
class Data{
public:int x,y,z;Data(){}Data(int a,int b,int c):x(a),y(b),z(c){}
//调用该函数的对象为运算符左边的变量
//参数为运算符右边的变量
Data* operator +(Data& d2)
{Data *d = new Data();d->x = this->x + d2.x;d->y = this->y + d2.y;d->z = this->z + d2.z;return d;
}
};
int main(int argc, char *argv[])
{Data d1(1,2,3);Data d2(1,2,3);Data* d3 = d1 + d2;cout << d3->x << d3->y << d3->z << endl;return 0;
} 示例3:重载==运算符
#include <iostream>
using namespace std;
class Data{
public:int x,y,z;Data(){}Data(int a,int b,int c):x(a),y(b),z(c){}
//调用该函数的对象为运算符左边的变量
//参数为运算符右边的变量bool operator ==(Data& d2){if(this->x == d2.x && this->y == d2.y && this->z == d2.z){return true;}else{return false;}}
};
int main(int argc, char *argv[])
{Data d1(1,2,3);Data d2(1,2,3);Data d3(2,2,3);cout << (d1 == d2) << endl;cout << (d1 == d3) << endl;return 0;
} 示例4:重载++运算符
注意
示例
#include <iostream>
using namespace std;
class Data{
public:int x,y,z;Data(){}Data(int a,int b,int c):x(a),y(b),z(c){}Data& operator ++()//++前置{++x;++y;++z;return *this;}Data operator ++(int)//++后置{Data old = *this;//记录旧值++x;++y;++z;return old;//返回旧值}
};
ostream& operator <<(ostream& out,Data& d)
{out << d.x << d.y << d.z << endl;return out;
}
int main(int argc, char *argv[])
{Data d1(1,2,3);++d1;cout << d1;Data d2(1,2,3);Data d3 = d2++;cout << d3;cout << d2;return 0;
} 示例5:重载*与->
要求
推演
#include <iostream>
using namespace std;
class Data{
private:int x,y,z;
public:Data(){cout << "无参构造函数" << endl;}Data(int a,int b,int c):x(a),y(b),z(c){cout << "有参构造函数" << endl;}~Data(){cout << "析构函数" << endl;}
};
int main(int argc, char *argv[])
{Data *p = new Data();return 0;
} #include <iostream>
using namespace std;
class Data{
private:
int x,y,z;
public:Data(){cout << "无参构造函数" << endl;}Data(int a,int b,int c):x(a),y(b),z(c){cout << "有参构造函数" << endl;}~Data(){cout << "析构函数" << endl;}
};
class FreeData{
private:Data* p;
public:FreeData(){p = NULL;}FreeData(Data* data){p = data;}~FreeData(){if(p != NULL){delete p;p = NULL;}}
};
int main(int argc, char *argv[])
{FreeData fd(new Data(1,2,3));return 0;
} #include <iostream>
using namespace std;
class Data{
private:int x,y,z;
public:Data(){cout << "无参构造函数" << endl;}Data(int a,int b,int c):x(a),y(b),z(c){cout << "有参构造函数" << endl;}~Data(){cout << "析构函数" << endl;}int getX(){return x;}
};
class FreeData{
private:Data* p;
public:FreeData(){p = NULL;}FreeData(Data* data){p = data;}~FreeData(){if(p != NULL){delete p;p = NULL;}}Data& operator *(){return *p;}Data* operator ->(){return p;}
};
int main(int argc, char *argv[])
{FreeData fd(new Data(1,2,3));cout << (*fd).getX() << endl;cout << fd->getX() << endl;return 0;
} 示例6:重载()
作用
示例
#include <iostream>
using namespace std;
class Data{
friend ostream& operator <<(ostream& out,Data& d);
private:int x,y,z;
public:Data(){cout << "无参构造函数" << endl;}Data(int a,int b,int c):x(a),y(b),z(c){cout << "有参构造函数" << endl;}~Data(){cout << "析构函数" << endl;}void operator ()(int a,int b,int c){this->x += a;this->y += b;this->z += c;}
};
ostream& operator <<(ostream& out,Data& d)
{out << d.x << "\t" << d.y << "\t" << d.z << endl;return out;
}
int main(int argc, char *argv[])
{Data d(1,2,3);d(2,5,8);cout << d;return 0;
} 示例7:重载=
#include <iostream>
using namespace std;
class Data{
friend ostream& operator <<(ostream& out,Data& d);
private:int x,y,z;
public:Data(){cout << "无参构造函数" << endl;}Data(int a,int b,int c):x(a),y(b),z(c){cout << "有参构造函数" << endl;}Data(const Data& d){cout << "执行拷贝构造" << endl;this->x = d.x;this->y = d.y;this->z = d.z;}~Data(){cout << "析构函数" << endl;}void operator =(Data& d){cout << "执行重载=运算符的函数" << endl;this->x = d.x;this->y = d.y;this->z = d.z;}
};
ostream& operator <<(ostream& out,Data& d)
{out << d.x << "\t" << d.y << "\t" << d.z << endl;return out;
}
int main(int argc, char *argv[])
{Data d1(1,2,3);Data d2(3,6,9);d1 = d2;//d1已完成初始化,执行重载的=号运算符Data d3 = d2;//d3未完成初始化,执行拷贝构造return 0;
} 注意:
相关文章:
C++ Day04 this指针,友元函数,重载
this指针 概念 谁调用 this 所在的函数 ,this 就存储谁的地址 特点 1, 在当前类的非静态成员函数中调用本类非静态成员时 , 默认有 this 关键字 2, 静态成员函数 , 没有 this 指针。 示例 #include <iostream> #include <cstring> using namespace std; class S…...
2023做车载测试真的可以远离内耗!转行车载月入20K!
2023年,车载测试正处于一个发展阶段,随着新能源汽车的蓬勃发展,电气化、智能化逐渐成为发展趋势。在汽车开发过程中,测试是非常重要的一个环节。现在软件越来越多地被应用到汽车上,对软件测试的需求也越来越多、越来越…...
LINUXZ
10.6.2 AT24C02 访问方法 设备地址 从芯片手册上可以知道,AT24C02 的设备地址跟它的 A2、A1、A0 引脚有关: 图 10.36 AT24C02 设备地址引脚配置 294 / 577 打开 I2C 模块的原理图: 开发板配套网盘资料\04_开发板原理图\ 04_Extend_modules\通…...
C#单例模式懒汉式与饿汉式
单例模式一般分为懒汉模式和饿汉模式,懒汉式单例在第一次引用时创建实例,不是在类加载时;饿汉式单例模式是一种在类加载时就创建实例的方式,因此也称为静态初始化。 单例模式实现的技巧时构造私有,向外提供静态实例。…...
小微初创企业,如何利用媒体宣传快速成长
传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 对于小微初创企业来说,利用媒体宣传可以快速提升品牌知名度、扩大影响力,进而促进企业的成长。 1.确定宣传目标:是增加销售、提升品牌知名度、还是推…...
【封装UI组件库系列】全局样式的定义与重置
封装UI组件库系列第二篇样式 🌟前言 🌟定义全局样式 生成主题色和不同亮度的颜色 编辑 中性色及其他变量 🌟样式重置 🌟总结 🌟前言 在前端开发中,大家…...
opencv将32位深图片合成视频跳帧解决办法
在合成视频时候,大多数的图片都是24位深度的(即RGB三通道,一个通道8位),但是也存在少量的32位深的图片(RGBA,三个颜色通道加上A这个透明度通道),32位和24位的格式是不一样…...
华为obs上传下载-Java版 2023-11-23
弄了半天,老师帮弄成功了,经过同意,分享到网上,希望能帮助更多人,至于怎么弄的,我也不知道。 创建idea项目后,项目结构,对应文件没有的创一个 pom.xm 注意改Java版本,我…...
2023年中国农业机器人行业市场规模及发展趋势分析[图]
农业机器人是一种机器,是机器人在农业生产中的运用,是一种可由不同程序软件控制,以适应各种作业,能感觉并适应作物种类或环境变化,有检测(如视觉等)和演算等人工智能的新一代无人自动操作机械。 农业机器人分类 资料来源…...
12英寸双轴半自动划片机:颠覆传统划切工艺的五大优势
随着科技的飞速发展,半导体行业对精密划切设备的需求日益增长。在这篇文章中,我们将深入探讨12英寸双轴半自动划片机的优势,这种划片机在半导体制造过程中扮演着至关重要的角色。以下是这种划片机的五大优势。 一、高精度划切 12英寸双轴半自…...
动态神经网络时间序列预测
大家好,我是带我去滑雪! 神经网络投照是否存在反锁与记忆可以分为静态神经网络与动态神经网络。动态神经网络是指神经网络带有反做与记忆功能,无论是局部反馈还是全局反锁。通过反馈与记忆,神经网络能将前一时刻的数据保留&#x…...
Unity 三维场景的搭建 软件构造实验报告
实验2:仿真系统功能实现 1.实验目的 (1)熟悉在Unity中设置仿真场景; (2)熟悉在Unity中C#语言的使用; (3)熟悉仿真功能的实现。 2.实验内容 新建一个仿真场景&#x…...
2024贵州大学计算机考研分析
24计算机考研|上岸指南 贵州大学 贵州大学计算机科学与技术学院(贵州大学省级示范性软件学院)位于贵州省贵阳市花溪区贵州大学东校区。 计算机科学与技术学院(软件学院)自1972年创办计算机软件本科专业开始,至今已有…...
Spring高级bean的实例化方法
bean的实例化方法 构造方法 实例化bean第一种:使用默认无参构造函数(常用) 第二种创建bean实例:静态工厂实例化(了解) 第三种:实例工厂(了解)与FactoryBean(实用)...
Vue2系列 — 渲染函数 (render + createElement)
官网文档:https://v2.cn.vuejs.org/v2/guide/render-function.html 1 render 函数 render 函数 不使用模板,使用 js 生成虚拟 dom 2 createElement() 接受的参数: 参数1 节点类型参数2 attribute参数3 子节点 3 DEMO <template>&…...
加载SSL证书
使用JDK1.8 开发工具包bin目录下的keytool.exe工具生成ssl密钥: keytool -genkey -alias mykey -keyalg RSA -keysize 2048 -validity 365 -keystore mykeystore.p -genkey: 表示创建密钥。-alias: 保存时的别名。-keyalg:加密算…...
redis 非关系型数据库
redis 非关系型数据库 redis 非关系型数据库,缓存型数据库 关系型数据库和非关系型数据库的区别: 关系型数据库是一个结构化的数据库,行和列 列:声明对象 行:记录对象的属性 表与表之间是有关联的,使用…...
Python配置与测试利器:Hydra + pytest的完美结合
简介:Hydra 和 pytest 可以一起使用,基于 Hydra Pytest 的应用可以轻松地管理复杂配置,并编写参数化的单元测试,使得Python开发和测试将变得更为高效。 安装: pip install hydra-core pytest案例源码:my…...
5.基于飞蛾扑火算法(MFO)优化的VMD参数(MFO-VMD)
代码的使用说明 基于飞蛾扑火算法优化的VMD参数 优化算法代码原理 飞蛾扑火优化算法(Moth-Flame Optimization,MFO)是一种新型元启发式优化算法,该算法是受飞蛾围绕火焰飞行启发而提出的,具有搜索速度快、寻优能力强的…...
爱创科技总裁谢朝晖荣获“推动医药健康产业高质量发展人物”
中国医药市场规模已经成为全球第二大医药市场,仅次于美国。近年来,随着中国经济的持续增长和人民生活水平的提高,医药市场需求不断扩大。政府对医疗卫生事业的投入也在不断加大,为医药行业的发展创造了良好的政策环境。为推动医药…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
