《老九学堂C++课程》《C++ primer》学习笔记。《老九学堂C++课程》详情请到B站搜索《老九零基础学编程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类型
再谈构造函数:构造函数是在创造对象的时候初始化对象,编译器会依据传递参数不同来匹配不同的构造函数
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() {
}