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 
#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 
#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)
//    {
//
//    }
    // 矩形转换成float
    operator 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 
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() {
}

你可能感兴趣的:(C++)