关键字explicit与构造函数

从Qt谈到C++(一):关键字explicit与构造函数
时间 2014-04-26 22:55:44 CSDN博客 原文 http://blog.csdn.net/guodongxiaren/article/details/24455653
提出疑问

当我们新建了一个Qt的widgets应用工程时。会自动生成一个框架,包含了几个文件。其中有个mainwindow.h的头文件。就是你要操纵的UI主界面了。我们看看其中的一段代码:

class MainWindow : public QMainWindow
{
Q_OBJECT//一个宏,暂不考虑

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private:
Ui::MainWindow *ui;
};

这段代码定义了一个新的类MainWindow,继承自QMainWindow。我们可以看到在它的构造函数里,前面有一个关键字 explicit 。相信大家都对没有这个关键字的构造函数不陌生。那么这个 explicit 是起到什么作用的呢?
explicit研究

explicit是C++中的关键字,不是C语言中的。英文直译是“明确的”、“显式的”意思。出现这个关键字的原因,是在C++中有这样规定的基础上: 当定义了只有一个参数的构造函数时,同时也定义了一种隐式的类型转换。 先看类型转换。

类型转换

C/C++中,有很多类型转换。比如:

double a = 12.34;
int b = (int)a;

我们都知道这时b的值是12. 在变量前面加括号包裹的类型,就能实现显式的类型转换。这种叫做强制类型转换。顺便值得一提的是,C++中还支持这种强制类型转换的例子:

double a = 12.34;
int b = int(a);

除此之外,还有一种转换叫做 隐式类型转换。

double a = 12.34;
int b = a;

同样的,b的值也是12.虽然没有显式的转换类型,但是编译器会帮你自动转换。同样的,不仅是基本数据类型,自己定义的类和对象之间也存在这种转换关系。

隐式转换的场景

等于号与构造函数

比如你有一个类的对象A:

class A
{
public:
A(int i)
{
a = i;
}
int getValue()
{
return a;
};
private:
int a;
};

你会发现,你在main函数中,使用下面的语句时是合法的:

A a = 10;

之所以类A的对象可以直接使用整型通过等于号来初始化,是因为这一语句调用了默认的单参数构造函数,其效果等价于 A temp(10); a(temp);

首先编译器执行A temp(10);在栈中创建了一个临时对象(假设叫做temp)。然后再调用对象a的拷贝初始化构造函数 a(temp) 给a初始化。然后临时对象temp销毁。这就是编译器做的隐式转换工作。你可以想到这样的隐式操作的结果和直接显示调用A a(10);的结果是一样的,但是隐式转换因为使用了拷贝构造函数所以在开销上会更高一些。当然这基本数据类型,或许不明显。如果一个复杂的对象,比如Qt的窗口。那么开销可想而知。

又如当你使用如下语句会不通过:

A a = “123”;

因为没有参数为字符串的单参数构造函数。知道了这个,你修改一下就能通过了。

class A
{
public:
A(int i)
{
a = i;
}
A(char * c)
{
a=c[0];
}
int getValue()
{
return a;
};
private:
int a;
};

函数调用

我们再定义一个函数print 用来打印A对象的值。

void print(A a)
{
cout<

include

using namespace std;
class A
{
public:
explicit A(int i);
A(char * c)
{
a=c[0];
}
int getValue()
{
return a;
};
private:
int a;
};
A::A(int i)//无需再指明explicit
{
a=i;
}
void print(A a)
{
cout<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值