Blog·Tanky WooABOUTRSS

[C++]类的自动类型转换和转换操作符

11 Sep 2011
这篇博客是从旧博客 WordPress 迁移过来,内容可能存在转换异常。

1.当构造函数只接受一个参数时,则该类可以与该参数类型相同的值转换。

看下面这个简单的例子:

// Woo.h file
#ifndef WOO_H
#define WOO_H

class Woo{
private:
    double mm;
public:
    /*explicit*/ Woo(double a);
    Woo() {mm=0;};
    void show();

    //operator double() const;
};

#endif
// Woo.cpp file
#include "stone.h"
#include 
using namespace std;

Woo::Woo(double a)
{
    mm = a;
}

void Woo::show()
{
    cout << "show function: " << mm << endl;
}

/*
Woo::operator double() const
{
    return double(mm);
}
*/
// main.cpp file
#include "stone.h"
#include 
using namespace std;

int main()
{
    Woo a;
    a = 13.3;
    a.show();

    /*
    Woo a(13.3);
    double b = a;
    cout << b << endl;
    */
}

运行结果:

zhuanhuan

其实,此处重点还是因为在赋值时,创建了一个该类的临时变量,然后将临时变量赋值给该类变量。

如果想要关闭这个特性,可以使用explicit关键字,只需要在类声明中的构造函数前加上explicit即可,如:

explicit Woo(double a);

此时我在VS2008下显示报错:

error C2679: 二进制“=”: 没有找到接受“double”类型的右操作数的运算符(或没有可接受的转换)

2.C++类型转换操作符

在上面,符合条件时,可以将double赋值给一个类类型,那反过来行吗?

可以,不过此时要使用C++的转换操作符函数。

转换函数是用户定义的强制类型转换,可以像使用强制类型转换一样使用它们。

转换函数的使用方法:

operator typeName();

typeName是要转换为的类型。

注意以下几点:

①.转换函数必须是类方法。

②.转换函数不能指定返回类型。

③.转换函数不能有参数。

我们还是使用上面的例子: 直接把注视掉的地方,把注视符号去掉即可。

运行结果:

zhuanhuan2

在网上还有另外两篇讲到了转换函数:

1.http://c.chinaitlab.com/example/837012.html

2.http://topic.csdn.net/u/20070626/17/34235b2e-212b-446f-8ca7-031a1fa5c39c.html

OK,结束~~

TankyWoo 标签: 自动类型转换类型转换函数Tanky Woo