福田建网站公司,网站备案规则,wordpress添加活动,泰和县网站免费建站类型自动转换1.C内置类型转换2.实现自定义类的类型转换《老九学堂C课程》《C primer》学习笔记。《老九学堂C课程》详情请到B站搜索《老九零基础学编程C入门》 -------------简单的事情重复做#xff0c;重复的事情用心做#xff0c;用心的事情坚持做(老九君)---------------…
类型自动转换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.hRectangle::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() {
}