我是靠谱客的博主 还单身棉花糖,最近开发中收集的这篇文章主要介绍c++类的类型转换函数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

之前学习的,可以将普通类型转换为类类型,需要借助转换构造函数。那么反过来,类类型可以转换为普通类型吗?

#include <stdio.h>
class TestCls{
public:
int a;
TestCls(int x = 0) : a(x)
{}
};
int main(void)
{
TestCls t1;
int i = t1;
printf("i = %dn", i);
return 0;
}

编译报错:
这里写图片描述

即使加上强制类型转换:

int i = (int)t1;

报错依旧。

一个类类型变量要转换成普通类型,需要借助类的类型转换函数。类型转换函数用于将类对象转换为其它类型,语法规则为:

operator Type()
{
Type ret;
//...
return ret;
}

加入类型转换函数之后:

class TestCls{
public:
int a;
TestCls(int x = 5) : a(x)
{}
/* 类型转换函数,将TestCls类转换为int类型 */
operator int()
{
return a;
}
};
int main(void)
{
TestCls t1;
int i = t1;
printf("i = %dn", i);
return 0;
}

编译运行:
这里写图片描述

使用类型转换函数需要注意:
1. 类型转换函数必须是成员函数,不能指定其返回类型,并且形参必须为空,返回值是隐含的,返回值类型是和转换的类型Type是相同的,在本例子中为int。
2. Type表示内置类型名、类类型名或者是类型别名(typedef)。除了void外,任何可作为函数返回类型的类型都可以定义转换函数的目标转换类型。一般不允许转换为数组或函数类型,但是可以转换为指针类型以及引用类型
3. 类型转换函数一般不应该改变被转换的对象,因此转换函数通常属性被定义为const。

int i = t1;能够编译运行,因为调用了类型转换t1对象的类型转换函数operator int()。

类型转换函数用于将类对象转换为其它类型,那么就可以实现将A类类型对象转换成B类类型对象:

class A
{
private:
int a;
public:
A(int x = 0) : a(x)
{}
char value()
{
return a;
}
};
class B
{
private:
char c;
public:
B(char y = 0) : c(y)
{}
char value()
{
return c;
}
};
int main(void)
{
A class_a;
B class_b(100);
class_a = class_b;
printf("class_a.a = %dn", class_a.value());
return 0;
}

两种不同类型的对象相互赋值,必然报错:
这里写图片描述

B类定义类型转换函数后:

class B
{
private:
char c;
public:
B(char y = 0) : c(y)
{}
char value()
{
return a;
}
operator A ()
{
A tmp(c);
return tmp;
}
};

编译运行正常:
这里写图片描述

class_a = class_b;其实等价于class_a = class_b.operator int();

在前面我们已经尝试通过转换构造函数的方法,同样可以实现将A类类型对象转换成B类类型对象:

class B;
//前向声明
class A
{
private:
int a;
public:
A(int x = 0) : a(x)
{}
A(B& cB)
{
}
char value()
{
return a;
}
};
class B
{
public:
char c;
public:
B(char y = 0) : c(y)
{}
char value()
{
return c;
}
/*operator A ()
{
A tmp(c);
return tmp;
}*/
};
int main(void)
{
A class_a;
B class_b(100);
class_a = class_b;
return 0;
}

需要注意,类型转换函数转换的是右值,转换构造函数转换的是左值。

右值的类型转换函数和左值的转换构造函数都可以实现隐式的类型转换,那么如果二者同时存在于代码中,在需要类型转换时,编译器会选择调用谁?

去除代码中的注释编译运行:
这里写图片描述
编译器因不知道该调用谁而报错。

类型转换函数和转换构造函数具有同等地位,编译器同样能够隐式的使用类型转换函数,在实际项目工程中为了代码的可控性,程序员一般不会使用编译器这个隐式转换功能。explicit关键字可去除转换构造函数的隐式调用,那类型转换函数呢?换个函数名即可,通常函数名为”TypetoTpye()”:

class B
{
public:
char c;
public:
B(char y = 0) : c(y)
{}
char value()
{
return c;
}
A toA ()
{
A tmp(c);
return tmp;
}
};
int main(void)
{
A class_a;
B class_b(100);
class_a = class_b.toA();
printf("class_a.a = %dn", class_a.value());
return 0;
}

事实上,很多成熟的类库都是这么实现的,如STL、QT等。

最后

以上就是还单身棉花糖为你收集整理的c++类的类型转换函数的全部内容,希望文章能够帮你解决c++类的类型转换函数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部