C++学习 Day.8 (重载运算符和类型转换运算符)ps:一大波参考博客来袭~~

news2024/11/16 1:19:02

this指针 详解请点这里

复制构造函数详解 点这里和这里

 指针的指针的地址,指针自身的地址,指针指向的地址 点这里 实例化解释很好

引用和指针的区别   点这里和这里

引用详解:C++:引用的简单理解 - Tom文星 - 博客园 (cnblogs.com)

 volatile关键字参阅:(7条消息) C++中volatile关键字的作用_nguliu的博客-CSDN博客_c++中volatile关键字的作用

类型转换参阅:

C++四种类型转换总结 - evenleo - 博客园 (cnblogs.com)

(7条消息) C++常用的类型转换函数_奇树谦的博客-CSDN博客_c++类型转换函数

复制赋值运算符:

#include<iostream>
using namespace std;
#include<string.h>

class MyString {
	private:
		char* buffer;
	public:
		MyString(const char* initInput) { //构造函数,令buffer=initInput
			if (initInput != NULL) {
				buffer = new char [strlen(initInput) + 1];
				strcpy(buffer, initInput);
			} else
				buffer = NULL;
		}
		MyString& operator=(const MyString& copySource) { //重载运算符=
			if (this != &copySource && copySource.buffer != NULL) {
				if (buffer != NULL)
					delete[] buffer;
				buffer = new char [strlen(copySource.buffer) + 1];

				strcpy(buffer, copySource.buffer);
			}
			return *this;
		}
		operator const char*() {//类型转换函数
			return buffer;
		}
		virtual ~MyString() {//虚析构函数
			delete[] buffer;
		}
};

int main() {
	MyString string1("Hello ");
	MyString string2(" World");

	cout << "Before assignment: " << endl;
	cout << string1 << string2 << endl;
	string2 = string1;
	cout << "After assignment string2 = string1: " << endl;
	cout << string1 << string2 << endl;

	return 0;
}

注:

要创建不允许复制的类,可将复制构造函数和复制赋值运算符都声明为私有的。只需这
样声明(而不提供实现)就足以让编译器在遇到试图复制对象(将对象按值传递给函数
或将一个对象赋给另一个对象)的代码时引发错误。

subscript:adj. 下标的,写在下方的,脚注的 n. 下标,脚注,下角数码

private default constructor:私有缺省构造函数
下标运算符让您能够像访问数组那样访问类,其典型语法如下:
return_type& operator [] (subscript_type& subscript);

MD,愈发难了,一气我就不学下标运算符了。

函数运算符 operator()

#include<iostream>
#include<string>
using namespace std;

class Display {
	public:
		void operator()(/*const*/ string input) const { //放在前面和放在后面有啥区别?
			cout << input << endl;
		}
};

int main() {

	Display displayFuncObj;

	// equivalent to displayFuncObj.operator () ("Display this string! ");
	displayFuncObj("Display this string!");
	
	return 0;
}

用于高性能编程的移动构造函数和移动赋值运算符

(12.5没学)拜拜

用户定义的字面量

 语法:

要自定义字面量,可像下面这样定义 operator “”

ReturnType operator "" YourLiteral(ValueType value)
{
// conversion code here
}

实例化:

#include<iostream>
using namespace std;

class Tem {
	public:
		double K;
		Tem() {}
		Tem(long double k): K(k) {}
};

Tem operator"" _C (long double c) {
	return Tem(c + 273.0);
}//只能在初始化时赋值

int operator"" _D(long double d) {
	return (d + 459.67) * 5 / 9;
}//单独拉出来赋值

Tem operator"" _F(long double f) {
	return Tem((f + 459.67) * 5 / 9);
}

int main() {

	Tem k1;
	k1.K = 31.73_D;

	Tem k2(0.0_C);

	cout << "k1 is " << k1.K << endl;
	cout << "k2 is " << k2.K << endl;
	return 0;
}

 不能重载的运算符:

 

类型转换运算符:

C++ 的发展过程中,不断有新的 C++ 类型转换运算符出现,这导致 C++ 编程社区分裂成两个阵营:一个阵营继续在其 C++ 应用程序中使用 C 风格类型转换;另一个阵营转而使用 C++ 编译器引入的类型转换关键字。前一个阵营认为,C++ 类型转换难以使用,且有时候功能变化不大,只有理论意义。 后一个阵营则显然由 C++ 语法纯粹论者组成,他们通过指出 C 风格类型转换的缺陷以支持其论点。
在现实世界中,这两个观点各行其道,读者最好通过阅读本章以了解每种风格的优缺点,然后形成自己的见解。————《21天学通C++》
4 C++ 类型转换运算符如下:
static_cast
dynamic_cast
reinterpret_cast
const_cast

 

使用语法如下:

destination_type result = cast_operator<destination_type> (object_to_cast);

关于这个我在文章开头好像已经引用过了,读者可以去看看,文章笔者都亲读过,感觉不错。

static_cast: 

 explicit:adj. 易于理解的;明确的;直言的

 

	double Pi = 3.14159265; 
	int num = static_cast<int>(Pi); // Making an otherwise implicit cast, explicit
	cout<<static_cast <double> (num)<<endl;

输出:

3

使用 const_cast

const_cast 让程序员能够关闭对象的访问修饰符 const 。您可能会问:为何要进行这种转换?在理

想情况下,程序员将经常在正确的地方使用关键字 const。不幸的是,现实世界并非如此,像下面这样的代码随处可见:

class SomeClass 
{ 
public: 
 // ... 
 void DisplayMembers(); //problem - display function isn't const 
};

在下面的函数中,以 const 引用的方式传递 object 显然是正确的。毕竟,显示函数应该是只读的,不应调用非 const 成员函数,即不应调用能够修改对象状态的函数。然而,DisplayMembers()本应为 const 的,但却没有这样定义。如果 SomeClass 归您所有,且源代码受您控制,则可对 DisplayMembers()进行修改。然而,在很多情况下,它可能属于第三方库,无法对其进行修改。在这种情况下,const_cast 将是您的救星。

void DisplayAllData (const SomeClass& object)
{
object.DisplayMembers (); // Compile failure
// reason: call to a non-const member using a const reference
}

在这种情况下,调用 DisplayMembers()的语法如下:

void DisplayAllData (const SomeClass& object)
{
SomeClass& refData = const_cast<SomeClass&>(object);
refData.DisplayMembers(); // Allowed!
}


不写了,烦啊,C艹怎么这么烦,投入java的怀抱

问与答

问:是否可使用 const_cast 对指向常量对象的指针或引用进行类型转换,以便修改常量对象的内容?
不要这样做。这样做的结果是不确定的,也绝不是您希望的。
问:我需要一个 Bird*,但只有一个 Dog*。编译器不允许将指向 Dog 对象的指针用作 Bird*。然而, 当我使用 reinterpret_cast Dog*转换为 Bird*时,编译器并不报错。看起来可使用这个指针来调用 Bird 的成员函数 Fly( ),可以这样做吗?
答: 绝对不要这样做。 reinterpret_cast 只改变对指针的解释,并不改变指向的对象(它还是 Dog )。对 Dog 对象调用 Fly() 函数将得不到所需的结果,还可能导致应用程序出现故障。
问:我有一个 Base 指针objBase,它指向一个Derived 对象。我确信objBase 指向的是一个Derived 对象,是否还需要使用 dynamic_cast
答: 由于您确定指向的是 Derived 对象,因此可使用 static_cast 提高运行性能。
问:C++提供了类型转换运算符,但却建议尽量不使用它们。这是为什么?
答: 您家里备有阿司匹林,却不会把它当饭吃。仅当真正需要时才使用类型转换。

好了,就当我学完了,白白奈

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

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

相关文章

SMC详解

SMC全称:Secure Monitor Call 目的&#xff1a;进入到EL3异常等级 应用场景&#xff1a;大于等于EL1异常等级下使用&#xff08;EL0下不能使用&#xff09; 官方介绍以及使用方式如下&#xff1a; 主要配置&#xff1a; (1) SCR_EL3.SMD&#xff1a; (2) HCR_EL2.TSC 主要功…

ArcGIS基础实验操作100例--实验20按像元修改栅格值

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 基础编辑篇--实验20 按像元修改栅格值 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

SpringCloud整合Seata(AT两阶段--场景: 下单减少库存)

文章目录零&#xff1a;前置操作 --- 搭建Seata服务一&#xff1a;介绍说明二&#xff1a;添加undolog表三&#xff1a;框架整合Seata相关依赖3.1&#xff1a;引入公共SEATA POM依赖3.2&#xff1a;业务服务引入SEATA公共组件依赖3.3&#xff1a;yml文件配置Seata客户端和注册信…

[C++]模板与STL简介

&#x1f941;作者&#xff1a; 华丞臧 &#x1f4d5;​​​​专栏&#xff1a;【C】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449;LeetCode 文章目录模板初阶…

AspNetCore中的日志组件

介绍 本文写作年代比较久远&#xff0c;最新日志文档请查看&#xff1a; .NET Core 和 ASP.NET Core 中的日志记录 | Microsoft Learn了解如何使用由 Microsoft Extension.Logging NuGet 包提供的日志记录框架。https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/l…

选择-C++选择分支

引言 你们喜欢吃"只因"肉? a > 喜欢 b > 还行 c > 不喜欢 请说出你的答案: 证明 真ikun 和假ikun 关键点 我现在 a 因为我是ikun 我是 唯一玩梗的CSDN技术型博主 哈哈所以夹带点私货 你们dddd(懂的都懂) 关注我,让你看到更多的C/C 的技术点和技术以外的梗…

CTF之MISC题目-简单流量

CTF系列文章 第一篇 CTF之密码学题目-classical && coding 第二篇 CTF之MISC题目-西游记 第三篇 CTF之MISC题目-简单流量 文章目录CTF系列文章前言一、题目是什么&#xff1f;二、解题步骤1.下载文件、解压2.使用wireshark3.解压flag.zip总结前言 这是一道关于网络数…

ElasticSearch-倒排索引

文章目录一、mysql数据库存在的问题1.1 模糊查询索引失效1.2 不能分词查询二、倒排索引一、mysql数据库存在的问题 1.1 模糊查询索引失效 假设要查询上图中title中包含"手机"的信息&#xff0c;那么sql语句是这样的 SELECT * FROM goods WHERE title LIKE %手机%;如…

功能更新 | 身份认证增强安全配置

在开始本文前&#xff0c;先给大家出个解谜题&#xff0c;密码在下一段文字里&#xff0c;由 9 个字组成&#xff0c;开动你的脑筋吧&#xff0c;我们在本文结尾会揭晓答案&#xff1a; 2022 年马上就要结束了&#xff0c;机遇与挑战并存的一年。昨天&#xff0c;北京郊区一些地…

企业电子招标采购系统源码及功能清单

​ ​ 一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点&#xff1a;对草稿进行编…

从卖货到广告,跨境电商解锁变现新模式

一、经济全球化背景下&#xff0c;跨境电商作为外贸发展的新模式&#xff0c;可谓势头正盛。而 2022 年&#xff0c;在汇率波动、欧美通胀等不可抗逆因素的影响下&#xff0c;跨境电商大环境也面临着诸多挑战。对于消费者而言&#xff0c;全球通货膨胀持续走高&#xff0c;物价…

List、List<Object>、List<?>

List、List、List<?>ListList<Object>List<?>demoList 1、声明的List集合对其 所指向的集合对象&#xff08;就是赋值的集合对象&#xff09;的限制:无泛型限制&#xff0c;并且无视指向的集合对象的泛型&#xff0c;直接当成List处理&#xff08;泛型擦除…

软件测试难吗?应该怎样学习?

软件测试是一份不错的职业&#xff0c;现在也有许多小伙伴想要学习软件测试技术&#xff0c;成为一名软件测试员。但是零经验的小白又担心不知道软件测试好不好学&#xff0c;应该如何学习软件测试能力&#xff0c;需要做哪些培训呢。下面就给大家推荐一些学习经验与技巧&#…

【JavaEE】JVM(八股文!)

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录【JVM内存划分】【JVM类加载】【JVM垃圾回收机制GC】一&#xff09;GC是啥二&#xff09;GC回收哪部分内存三&#xff09;具体怎么回收四&#xff09;怎么找垃圾&#xff08;判定某个对象是否是垃圾&#xff09;五&a…

圆和椭圆外投影

1 圆外一点在缩放到圆上 圆方程: x2y222x^2y^2 2^2 x2y222 直线方程: ykxy kx ykx 圆外一点: A(3,3)A(3,3)A(3,3) 求点B. 方法1-解方程 圆外一点A(3,3)A(3,3)A(3,3),那么:直线k1k1k1,直线方程:yxyxyx 方程联立: x2x24x^2 x^2 4 \\ x2x24 x2y2x \sqrt{2} \\ y \sqrt…

点云 3D 分割 - SqueezeSeg(ICRA 2018)

点云 3D 分割 - SqueezeSeg&#xff08;ICRA 2018&#xff09;摘要1. 引言2. 相关工作A. 三维激光雷达点云的语义分割B. 用于3D点云的CNNC. 图像的语义分割D. 通过模拟收集数据3. 方法描述A. 点云变换B. 网络结构C. 条件随机场D. 数据收集4. 实验A. 评估指标B. 实验设置C. 实验…

2022电商行业重磅年度报告:八大年度关键词盘点

2022年终于过去&#xff0c;当网易云音乐推出“年度报告”霸屏朋友圈&#xff0c;它在试图唤起那些可能被遗忘的情绪和小心思。 这一年&#xff0c;有人悲观&#xff0c;有人积极&#xff0c;有人凭实力搭上了顺风车&#xff0c;也有人放弃了抵抗。这一年&#xff0c;作为电商人…

Mybatis学习笔记 | 动力节点老杜

目录 一、MyBatis概述 历史 MyBatis特点 ORM概述 二、Mybatis入门 1、SqlSessionFactory和SqlSession 2、核心配置文件的加载 3、mybatis事务管理机制 4、第一个mybatis程序 5、mybatis继承日志 三、mybatis增删改查 1、增加 通过Map传值 通过实体类传值 2、删除…

【uniapp】如何实现拖动文件直接上传

做uniapp项目发布H5有个后台管理&#xff0c;用户说上传文件的体验需要改进&#xff0c;那个弹出选择文件对话框然后去填文件路径选择文件上传&#xff0c;感觉操作太麻烦&#xff0c;于是就有了这么一个需求&#xff0c;需要实现拖动文件直接上传的&#xff0c;这样效率和体验…

九、动态组件与插槽

一、动态组件 1.1、什么是动态组件 动态组件指的是动态切换组件的显示与隐藏。 1.2、如何实现动态组件渲染 vue提供了一个内置的<component>组件&#xff0c;专门用来实现动态组件的渲染。示例代码如下&#xff1a; data() {// 1. 当前要渲染的组件名称return {comN…