类类型与其他类型的转换

简介:

类型学转换成其他类型有两种方式:

    一、用构造函数,将基本类型转为构造类型

        1.用初始化的形式;

            

class X

{

public:

X(int n);

~X();

};

void f(X arg);

...

int main(){

    X(3);

    X=a;//a隐式调用构造函数X(int n);

    f(5);//把5调用构造函数X(int n)转为X arg.然后调用构造函数。

    return 0;

}

    二、因为带参数的构造函数无法将类类型转为基本类型,所以设置类型转换函数

#include<iostream>

using namespace std;

class rational

{

public:

rational();

rational(int n,int d=1);

rational(double x);//将double类型转换成类类型。

operator double();//将类类型转变为double类型,且注意其没有返回值。

friend rational& operator+(const rational&, const rational&);

friend ostream & operator <<( ostream& os, const rational&);

//注意这里输出类ostream前面不可以加const因为在输出流经过os时会修改os

        //且类型一定是引用类型因为必须用cout对象本身

~rational();


private:

int numerator;

int denominator;

};

int gcd(int a, int b);

rational::rational()

{

numerator = 0;

denominator = 0;

}

rational::rational(int n,int d){

int g;

if (d == 1){

numerator = n;

denominator = d;

}

else{

g = gcd(n, d);//求分子分母的最大公约数

numerator = n / g;//把分母化成最简

denominator = d / g;

}

}

rational::rational(double x){

int a, b, g;

a = int(x*1e5);//x乘10的5次方。把小数变成整数

b = int(1e5);

g = gcd(a, b);

numerator = a / g;

denominator = b / g;

}

rational::~rational()

{

}

rational::operator double(){//虽然没有返回值依然要返回double类型的数。

return double(numerator) / double(denominator);

}

rational& operator +(const rational& a, const rational& b){

rational c;

int d = a.denominator*b.denominator;

int n = a.numerator*b.denominator + a.denominator*b.numerator;

int g = gcd(n, d);

c.denominator = d / g;//将分子分母化为最简

c.numerator = n / g;

return c;//返回类型是引用还是类类型都可以。

}

ostream& operator <<(ostream& os, const rational& a){

os << a.numerator;

if (a.denominator != 1){

os << "/" << a.denominator;


}

return os;//这里返回os类型的引用目的是连续使用cout<<"ss"<<"sss";

}

int gcd(int n, int d){//求最大公约数的算法

if (d == 0) return n;

else{

return gcd(d, n%d);

}

}

int main(){

rational a(2, 4);

rational b = 0.3;

rational c = a + b;

cout << double(a) << "+" << double(b)<<"="<<double(c)<<endl;

//将类类型对象a,b,c转换成double类型。

cout << a << "+" << b << "=" << c << endl;

double x = b;

c = x + 1 + 0.6;

cout << x << "+" << 1 << "+" << 0.6 << "=" << c << endl;

cout << rational(x) << "+" << rational(1) << "+" << rational(0.6) << "=" << c << endl;

system("pause");

}




本文转自 神迹难觅 51CTO博客,原文链接:http://blog.51cto.com/ji123/1915870,如需转载请自行联系原作者
相关文章
|
7月前
|
存储 开发者
如何确定常量的类型
在编程中,常量是程序中值不会改变的量。确定常量的类型是非常重要的,因为它直接影响了程序的效率和可读性。选择正确的常量类型可以确保程序占用更少的内存,运行更快,并且更容易理解和维护。
71 2
|
存储 编译器 C++
C++中的转换构造函数
在 C/C++ 中,不同的数据类型之间可以相互转换。无需用户指明如何转换的称为自动类型转换(隐式类型转换),需要用户显式地指明如何转换的称为强制类型转换。 自动类型转换示例: int a = 6; a = 7.5 + a; 编译器对 7.5 是作为 double 类型处理的,在求解表达式时,先将 a 转换为 double 类型,然后与 7.5 相加,得到和为 13.5。在向整型变量 a 赋值时,将 13.5 转换为整数 13,然后赋给 a。整个过程中,我们并没有告诉编译器如何去做,编译器使用内置的规则完成数据类型的转换。强制类型转换示例: int n = 100
|
存储
3.2.6 怎样确定常量的类型
3.2.6 怎样确定常量的类型
48 0
|
3月前
|
安全 程序员 C语言
C++(四)类型强转
本文详细介绍了C++中的四种类型强制转换:`static_cast`、`reinterpret_cast`、`const_cast`和`dynamic_cast`。每种转换都有其特定用途和适用场景,如`static_cast`用于相关类型间的显式转换,`reinterpret_cast`用于低层内存布局操作,`const_cast`用于添加或移除`const`限定符,而`dynamic_cast`则用于运行时的类型检查和转换。通过具体示例展示了如何正确使用这四种转换操作符,帮助开发者更好地理解和掌握C++中的类型转换机制。
|
6月前
|
编译器 程序员 语音技术
C++的超20种函数类型分享
C++超20种函数类型:编程语言规定规则,编译器实现预定规则
|
7月前
|
JavaScript 前端开发 程序员
强制类型转换和隐式类型传换是什么?他们的区别又是什么?
强制类型转换和隐式类型传换是什么?他们的区别又是什么?
|
Java
对象类型转换
对象类型转换
63 0
|
7月前
|
JavaScript 前端开发 编译器
TypeScript 中的基础类型:原始类型、对象类型、数组类型、元组类型、枚举类型和联合类型
TypeScript 中的基础类型:原始类型、对象类型、数组类型、元组类型、枚举类型和联合类型
76 1
C++转换构造函数以及类型转换函数
🐰转换构造函数 🐰类型转换函数
1、原始类型与引用类型(区别)
1、原始类型与引用类型(区别)
144 0