对于explicit这个关键字,网上有很多的博客和资料都,但有些博主写的博文感觉莫名其妙,或者写不到重点。
在此我把我自己对explicit关键字的理解写出来:
网上的某一版本:
关于这一版本,我是感觉莫名其妙,其中有两点,
下面我写一段代码:
#include <iostream>
#include <string>
using namespace std;
class Base {
public:
Base(int data) {
cout << "Base construcation called!\n";
m_data = new int;
*m_data = data;
}
~Base() {
}
void print() {
cout << *m_data << endl;
}
int getData()const {
return *m_data;
}
void setData(const int data) {
*m_data = data;
}
void operator = (const int data) {
cout << "operator = called!\n";
*m_data = data;
}
private:
int *m_data;
};
void main() {
Base _base1(1);
Base _base2 = 2;
_base1.print();
_base2.print();
_base2 = 3;
_base2.print();
getchar();
}
程序的运行结果如下:
通过运行结果可以发现,当没有explicit关键字调用 Base _base2=2时,并没有生成什么临时对象(因为对象的生成必定要调用构造函数)。
其实当程序执行到Base _base2=2时,他会把这段代码当成Base _base(2)来执行。
这个结果可以从反汇编代码里面得到:
可以看到一模一样的反汇编代码!
下面我来说下为什么C++要有这个explicit关键字!
我个人觉得应该是这样的:
用Qt的代码来举栗子,当创建一个界面类时Qt代码如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
当某一个逻辑里面,要调用这个MainWindow时,我们可以这么做,如下代码:
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w1;
MainWindow w2(w1);
w1.show();
w2.show();
return a.exec();
}
当去掉explicit关键字后,写这样的一个代码,看看会不会让人感到莫名其妙:
代码如下:
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w1;
MainWindow *w2=new MainWindow(NULL);
MainWindow w3=NULL;
MainWindow *w4=NULL;
return a.exec();
}
这样的代码是不是会让人感到莫名其妙。
当然这个程序在Qt里面是跑不起来的,因为Qt中有个Q_DISABLE_COPY,以后将会对这个Q_DISABLE_COPY宏进行说明