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)是一种新型元启发式优化算法,该算法是受飞蛾围绕火焰飞行启发而提出的,具有搜索速度快、寻优能力强的…...
爱创科技总裁谢朝晖荣获“推动医药健康产业高质量发展人物”
中国医药市场规模已经成为全球第二大医药市场,仅次于美国。近年来,随着中国经济的持续增长和人民生活水平的提高,医药市场需求不断扩大。政府对医疗卫生事业的投入也在不断加大,为医药行业的发展创造了良好的政策环境。为推动医药…...
别再用USB 2.0的思维画板子了!USB 3.0硬件设计避坑指南(附FT602Q实战)
从USB 2.0到USB 3.0:硬件工程师必须掌握的五大设计范式升级 当USB 3.0的5Gbps传输速率成为现代设备的标配时,许多硬件工程师仍然在用USB 2.0时代的思维设计电路。这种思维惯性带来的信号完整性问题,往往在项目后期才会暴露——信号抖动超标、…...
(论文速读)UniConvNet: 意尺度卷积神经网络在保持渐近高斯分布的同时扩展有效接受野
论文题目:UniConvNet: Expanding Effective Receptive Field while Maintaining Asymptotically Gaussian Distribution for ConvNets of Any Scale(任意尺度卷积神经网络在保持渐近高斯分布的同时扩展有效接受野)会议:ICCV2025摘…...
PCB焊点质量电子设备可靠性核心基石
在电子制造领域,PCB 焊点是连接元器件与电路板的 “神经节点”,既是电气信号传输的通道,也是机械固定的关键结构。一个微小的焊点失效,可能导致整个设备功能瘫痪,因此焊点质量直接决定电子设备的稳定性、使用寿命与安全…...
openharmony源码编译之 修改分区大小指南
RK3588 OpenHarmony 分区大小修改指南 概述 修改系统分区大小需要修改两处配置,必须保持一致,否则会导致烧录失败。一、涉及的配置文件序号文件路径作用单位1vendor/kaihong/khp_rk3588_ic816/image_conf/system_image_conf.txt编译时生成镜像的大小字节…...
别光看FPS了!用thop和PyTorch Event给你的模型做个‘全身体检’(附完整代码)
别光看FPS了!用thop和PyTorch Event给你的模型做个‘全身体检’(附完整代码) 在深度学习模型开发中,很多工程师习惯性地把FPS(每秒帧数)作为衡量模型性能的唯一标准。这就像只用体温来判断一个人的健康状况…...
研究人工智能,何以落于上古汉语同源词意义系统
概括文章思路: ①人工智能→认知(高态信息运作过程)→意识精神(信息高级形态)→全信息→语义信息→语义系统→…… ②人工智能→意义逻辑(本体内容逻辑)→语义逻辑→语义系统→…… ③语义系…...
2026年苹果系统将推“Extensions”功能,AI服务选择不再局限于ChatGPT!
苹果2026年系统更新:引入“Extensions”功能据MacRumors报道,苹果计划在2026年秋季发布的iOS 27、iPadOS 27及macOS 27系统中,引入名为“Extensions”的新功能。该功能允许用户为Apple Intelligence的各项功能自主选择第三方AI服务࿰…...
报关单填错被退单,真不是关务员不用心
一份报关单 50 多个字段,HS 编码、品名规格、成交方式、箱型港口,随便填错一个,海关系统直接退单。退单之后重新整理资料、修改字段、再次提交,快的两三天,赶上船期紧张就是一周起步。 这不是个别企业的倒霉事&#x…...
Topit终极指南:让Mac窗口置顶显示的高效生产力工具
Topit终极指南:让Mac窗口置顶显示的高效生产力工具 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 你是否曾经在多个应用间频繁切换,只为…...
别再手动转字段了!Spring Boot 2.7.x 里 Jackson 全局下划线转驼峰,一个配置就搞定
Spring Boot 2.7.x全局命名策略:告别字段转换的重复劳动 在前后端分离架构成为主流的今天,数据格式的统一却成了开发者们日常的痛点。每当看到代码中散落各处的JsonProperty注解,或是为了适配不同系统的命名规范而编写的转换工具类࿰…...
