C++|Qt工作笔记-对explicit的认识(Qt中一般情况下为什么会自动加上这个关键字)

对于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宏进行说明

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/81413111
今日推荐