C++(20)--类型自动转换

类型自动转换

  • 1.C++内置类型转换
  • 2.实现自定义类的类型转换

《老九学堂C++课程》《C++ primer》学习笔记。《老九学堂C++课程》详情请到B站搜索《老九零基础学编程C++入门》
-------------简单的事情重复做,重复的事情用心做,用心的事情坚持做(老九君)---------------

1.C++内置类型转换

// 自动类型转换(隐式类型转换)
int num = 111;
num = 222.2 + num;    
// 显示类型转换
int num = int(99.9);
// C 语言中的显式类型转换
int num = (int)99.5;

注意点:不管是自动转换,还是强制转换,实质是内置类型已经重载了对应的运算符。一些默认的转换规则为:
1.浮点->整形:舍弃小数部分
2.整形->浮点:数值不变,存储形式变了,以指数形式存储
3.double->float:注意数值
4.字符类型可以赋值给整形变量,此时存入的是字符的ASCLL码
5.将int、long、short传递给char型变量,只将低8位原封不动的送到char型变量中
6.有符号->无符号,连同原来的符号位一起传送

C++允许自己定义类型转换规则,通过类的成员函数的形式来实现
将其他类型转 换为 当前类型需要借助 转换构造函数

demo: 说明为了获得目标类型,编译器会不择手段,综合使用内置转换规则和用户自定义的规则, 进行多级类型转换。

// 自定义rectangle类,假设具有三种构造函数
Rectangle();
Rectangle(float width);
Rectangle(float width, float height);Rectangle rect(25.5, 18.8);
Rectangle rect2;
rect2 = rect1 + 98;
// 编译器会根据内置类型规则先将int 类型98转换为double类型的98.0
// 再根据用户自定义规则将double类型的98.5转换成Rectangle类型

再谈构造函数:构造函数是在创造对象的时候初始化对象,编译器会依据传递参数不同来匹配不同的构造函数

2.实现自定义类的类型转换

1.基本类型->当前类型–转换构造函数实现
2.当前类型->基本类型–类型转换函数实现
类型转换函数:将当前的类型转换成其他类型。只能以成员函数的形式出现,也就是只能出现在类中

形式上没有返回值,其实是隐式指明了返回值的类型。
没有参数,因为需要将当前类对象转换成其他类型。

operator type(){return data;
}
// 实际上编译器会把当前对象的地址赋给this 指针,在函数体内部即可以操作当前的对象。
operator float() const{return this->width;
}operator float(){return Circle(width * 2); 
}

demo1:矩形、圆形类型转换

//mian.cpp
#include <iostream>
#include "Rectangle.h"
using namespace std;
void TestRectangle()
{Rectangle rect1;                            // 调用默认构造Rectangle rect2(25.0, 50.5);   // 调用代参构造Rectangle rect3(rect1);                     // 调用拷贝构造// 能够与基本类型进行互相转换呢Rectangle rect4 = 55;                        // 想变成正方型,调用一个参数的构造--转换构造Rectangle rect5(55);rect4.display();
//    Rectangle rect6;                          // 需要重载加号运算符吧
//    rect6 = rect5 + "A" + false;float rect4_width = float(rect4);cout << rect4_width << endl;Circle circle1 = rect4;                    // 矩形和圆形之间可以相互转换cout << "圆的信息:" << circle1 << endl;}
int main() {TestRectangle();return 0;
}
//Rectangle.h
//
// Created by 陈莹莹 on 2021/3/10.
//
#ifndef CHAPTER12_RECTANGLE_H
#define CHAPTER12_RECTANGLE_H
#include <iostream>
#include "Circle.h"
using namespace std;
// 自定义矩形类class Rectangle {
public:Rectangle();                            // 无参构造,可以由编译器自动生成Rectangle(float width, float height);   // 代参构造, 用户定义的普通代参构造Rectangle(const Rectangle & rect);      // 拷贝构造,在以拷贝方式初始化对象时调用Rectangle(float width);                 // 转换构造--将其他类型转换为当前类型时使用// 将几个构造函数融合在一起写(拷贝构造还是需要单独写)---感觉这么写可以,但是和转化个构造单独实现还是不一样吧
//    Rectangle(float width = 0, float height = 0): width(width),height(height)
//    {
//
//    }// 矩形转换成floatoperator float() const{return width;}// 矩形转换成Circle类型operator Circle() const{return Circle(width/2);}void display(){cout << "width:" << width << endl;cout << "height:" << height << endl;}~Rectangle(); //
private:int width;int height;
};
#endif //CHAPTER12_RECTANGLE_H
//Rectangle.cpp
//
// Created by 陈莹莹 on 2021/3/10.
//#include "Rectangle.h"Rectangle::Rectangle():width(0),height(0)
{
}Rectangle::Rectangle(float width, float height):width(width), height(height)
{}
Rectangle::Rectangle(const Rectangle & rect)
{
}
Rectangle::Rectangle(float width):width(width),height(width)
{// 构建了一个矩形
}Rectangle::~Rectangle()
{
}
//Circle.h
//
// Created by 陈莹莹 on 2021/3/10.
//#ifndef CHAPTER12_CIRCLE_H
#define CHAPTER12_CIRCLE_H
#include <iostream>
using namespace std;
class Circle {
public://Circle();Circle(float radius = 0):radius(radius){}friend ostream & operator<<(ostream & out, const Circle & circle);~Circle();
private:float radius;float area;
};
#endif //CHAPTER12_CIRCLE_H
//Circle.cpp
//
// Created by 陈莹莹 on 2021/3/10.
//
#include "Circle.h"
ostream & operator<<(ostream & out, const Circle & circle)
{out << circle.radius;out << endl;
}
Circle::~Circle() {
}

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

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

相关文章

关于遍历linux的文件目录的坑- readdir

去年给公司写了一个配置服务器,目的是解决运维的工作量太大,而且传送服务器需要的配置文件需要脚本传送到各个服(每个服ip不一样,需要scp),然后再刷新通知各个GameServer,中间有没有传送失败并不得知,而且维护相当麻烦,所以我写了这个服务器,所有区服的配置都在这里边…

终于,我读懂了所有Java集合——sort

Collections.sort 事实上Collections.sort方法底层就是调用的Arrays.sort方法&#xff0c;而Arrays.sort使用了两种排序方法&#xff0c;快速排序和优化的归并排序。 快速排序主要是对那些基本类型数据&#xff08;int,short,long等&#xff09;排序&#xff0c; 而归并排序用于…

PRML(1)--绪论(上)多项式曲线拟合、概率论

PRML绪论1.1 多项式曲线拟合1.1.1 问题描述1.1.2 最小化平方和误差1.1.3 多项式阶数确定1.1.4 有趣问题--高阶模型为什么效果不好1.1.4 数据集规模对模型的影响1.1.5 参数正则化缓解过拟合问题1.2 概率论1.2.1离散型随机变量1.2.2 连续型随机变量1.2.3 期望和方差1.2.4 贝叶斯概…

大数加减乘

如标题&#xff0c;不解释。 加 #include<stdio.h> #include<string.h> int main() {char a[1000],b[1000];int i,s[1000],len1,len2,len,j;while(scanf("%s%s",a,b)!EOF) //用字符数组来储存数{for(i0;i<1000;i)s[i]0;len1strlen(a);len2strlen(b…

在GCC和Visual Studio中使用hash_map

熟悉STL或熟悉ACM/ICPC的话&#xff0c;其中的set, map, multiset, multimap一定用过无数次了&#xff0c;它们都是用平衡二叉树&#xff08;红黑树&#xff09;实现的&#xff0c;复杂度为O(lgn)。我们也知道set, map可以通过哈希来实现&#xff0c;复杂度只有O(1)&#xff0c…

C++(21)--Astah uml 画C++类图

Astah uml 画C类图1.安装2.使用《老九学堂C课程》《老九学堂C课程》详情请到B站搜索《老九零基础学编程C入门》-------------简单的事情重复做&#xff0c;重复的事情用心做&#xff0c;用心的事情坚持做(老九君)--------------- ASTAH&#xff1a;类图工具&#xff0c;用于理…

redis3.0.0 集群安装详细步骤

Redis集群部署文档(centos6系统) &#xff08;要让集群正常工作至少需要3个主节点&#xff0c;在这里我们要创建6个redis节点&#xff0c;其中三个为主节点&#xff0c;三个为从节点&#xff0c;对应的redis节点的ip和端口对应关系如下&#xff09; 127.0.0.1:7000 127.0.0.1:7…

Redis集群添加节点

Redis集群添加节点 1&#xff1a;首先把需要添加的节点启动 cd /usr/local/cluster/ mkdir 7006 cp /usr/local/cluster/redis.conf /usr/local/cluster/7006/ cd /usr/local/cluster/7006/ vi redis.conf ##修改redis.conf中的port参数的值为7006 redis-server redis.c…

PRML(2)--绪论(下)模型选择、纬度灾难、决策论、信息论

PRML绪论1.3 模型选择1.4 纬度灾难1.5 决策论1.5.1最小错误分率1.5.2最小化期望损失1.5.3拒绝选项1.5.4推断和决策1.5.5 回归问题的损失函数1.6 信息论1.3 模型选择 模型过复杂会造成过拟合问题&#xff0c;需要通过一些技术来降低模型的复杂度。 就最大似然而言&#xff0c;可…

leetcode112 路径总和

给定一个二叉树和一个目标和&#xff0c;判断该树中是否存在根节点到叶子节点的路径&#xff0c;这条路径上所有节点值相加等于目标和。 说明: 叶子节点是指没有子节点的节点。 示例: 给定如下二叉树&#xff0c;以及目标和 sum 22&#xff0c; 5 / \ …

关于游戏架构设计的一些整理吧

一个大型的网落游戏服务器应该包含几个模块:网络通讯,业务逻辑,数据存储,守护监控(不是必须),其中业务逻辑可能根据具体需要,又划分为好几个子模块。 这里说的模块可以指一个进程,或者一个线程方式存在,本质上就是一些类的封装。

linux时间轮 Timing-Wheel的实现

过一段时间上传更新自己的心得&#xff0c;以及linux的时间轮实现 现在git上传自己的C代码 gitgithub.com:pbymw8iwm/Timing-Wheel.git

leetcode128 最长连续序列

给定一个未排序的整数数组&#xff0c;找出最长连续序列的长度。 要求算法的时间复杂度为 O(n)。 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为4 思路&#xff1a;map记录某个连续序列端点的最大长度。 对于数字i&#xff…

C++(22)--继承和派生

继承和派生1.基本概念2.实现公有继承3.私有继承的例子4. 继承和组合《老九学堂C课程》《C primer》学习笔记。《老九学堂C课程》详情请到B站搜索《老九零基础学编程C入门》-------------简单的事情重复做&#xff0c;重复的事情用心做&#xff0c;用心的事情坚持做(老九君)----…

Python- 解决PIP下载安装速度慢

对于Python开发用户来讲&#xff0c;PIP安装软件包是家常便饭。但国外的源下载速度实在太慢&#xff0c;浪费时间。而且经常出现下载后安装出错问题。所以把PIP安装源替换成国内镜像&#xff0c;可以大幅提升下载速度&#xff0c;还可以提高安装成功率。 国内源&#xff1a; …

leetcode102 二叉树的层次遍历

给定一个二叉树&#xff0c;返回其按层次遍历的节点值。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回其层次遍历结果&#xff1a; [ [3], [9,20], [15…

Windows Git客户端搭建

最近开始做Windows 开发&#xff0c;所以找了一些windows下安装git的教程 本文环境&#xff1a; 操作系统&#xff1a;Windows XP SP3 Git客户端&#xff1a;TortoiseGit-1.8.16.0-32bit 一、安装Git客户端 全部安装均采用默认&#xff01; 1. 安装支撑软件 msysgit: http://ms…

C++(23)--多态性与虚函数

多态性与虚函数1.静态多态-重载2.动态多态-重写2.1 向上转换/向下转换3.虚函数的工作原理4.纯虚函数和抽象类5.补充项目(都市浮生记)-卒《老九学堂C课程》学习笔记。《老九学堂C课程》详情请到B站搜索《老九零基础学编程C入门》-------------简单的事情重复做&#xff0c;重复的…

如何在Appscale下发布自己的应用(一)

本篇文章主要讲如何在本地搭建appscale环境。由于国内的信息资源有限&#xff0c;很多重要的论坛被墙了&#xff0c;所以遇到不少麻烦&#xff0c;由于最近一段时间vpn也被封掉了&#xff0c;我只能通过特殊渠道方法来翻墙查阅资料&#xff0c;走了不少弯路。 1.先说系统和环境…

总结了线程安全性的二十四个精华问题

1、对象的状态&#xff1a;对象的状态是指存储在状态变量中的数据&#xff0c;对象的状态可能包括其他依赖对象的域。在对象的状态中包含了任何可能影响其外部可见行为的数据。 2、一个对象是否是线程安全的&#xff0c;取决于它是否被多个线程访问。这指的是在程序中访问对象的…