这是Qt定义的两个宏,很多项目中有大量的使用,这里提及,是因为在很多项目中存在一些滥用的情况。

任何一种技术,我们不能为了用而用,一定要弄清楚,它存在的原因是什么,使用它的好处是什么,使用它的坏处是什么,不能刚学会一种用法,知道它的好处,就使劲用,你还要清楚它的坏处,合理去使用。否则它只会让你代码可维护性更差。

public、private、protected关键字的作用

这是C++引入的关键字,其实作用,作为C++开发人员都清楚,但是大多数人,知道它的作用,但是确不清楚为啥C++需要引入这样的关键字。

C++作为高级语言,引入任何东西,有的是为保持一致性,有的是保证安全性,总之只有一个目的,就是让开发者能够更好的编码,而这个3个关键字,就是为了保证安全性,同时还能够提高可读性。

那它怎么保证其安全性的呢?我们举一个例子:

class MyClass{

public:

void pushNum(int num){

numbers.push_back(num);

++count;

}

std::vector<int> numbers;  //这里我们假设,需要单独使用一个变量统计容器的数量

int count = 0;

};

当我们调用pushNum时,numbers的大小与count是一致的,可是如果numbers和count是非私有的,那么其他文件在调用MyClass,由于没有限制,则可以随意的直接使用numbers进行任意操作,这就会导致numbers和count不一致,使得代码会变得极为的不安全,总而言之,这些关键字,能够保证类的独立性,安全性。

因此通常我们会把成员变量私有化,保证其它类对于该类的调用,只能通过当前类的接口进行修改,我们只需要保证接口的实现是正确的,就能保证当前的类是安全的。

简而言之,就是限定了类的可触范围,使代码的安全性和可调试性变高。

再来谈谈Q_D和Q_Q的使用

public关键字修饰的函数,可以理解为类对外的接口,因此通常,我们只需要提供外界需要用到接口就行,对于那些外面用不到的函数,

我们通常可以私有化,像类的成员变量,通常都是私有化处理的。

但是我们反过来再看, 对于private修饰的成员变量或者函数,既然对于其它类来说,它是不可直接接触的,我们为什么要把它放在头文件声明了?

我们有很多手段可以将私有化的东西,进行隐藏。

第一种方法: 比如,纯接口开发(有一些第三方库,就是这么搞的,对外提供的头文件中的类,全是纯虚类) PS:这个,不过多解释哈。

第二种方法: 就是使用Qt的这两个宏

我们举一个例子,简单解释一下:

//头文件

class MyClassPrivate;

class MyClass{

public:

MyClass();

void pushNum(int num);

private:

std::shared_ptr<MyClassPrivate> d;

};

//源文件, 这个类,为把MyClass所有的私有成员,私有成员函数,全部囊括进来

class MyClassPrivate{

public:

std::vector<int> numbers;

int count;

};

MyClass::MyClass():d(std::make_shared<MyClassPrivate>()){

}

void MyClass::pushNum(int num){

d→numbers.push_back(num);

d→count += 1;

}

这个例子,我已经简化了Qt的使用,大致的原理是一样的,就一个目的,就是为了把类的私有成员

隐藏到源码当中。

这样封装有什么好处和坏处呢?

好处:

  1.  简化头文件,一个类如果设计合理,一般我们只需要看接口。
  2.  当我们修改私有函数和成员变量时,不会再修改头文件,因此就不会重编包含该头文件的

其它的源文件,提高编码效率。

坏处:

1.  最明显的坏处,就是增加了代码的开发量。

2.  调用层级变深,可调试性和性能都是略微降低。

合理的使用Q_D和Q_Q

我们已经清楚了Q_D和Q_Q的作用了哈,这样开发了,虽然自己编码可能更加耗时了,但无形的提高了其它人的编码效率。

因此,如果我们要用,就一定要遵循一个原则,就是按正常的实现好一个类,仅仅把类中原本的私有成员和私有函数进行腾挪,切记,不要像很多项目中的使用,几乎将原类的所有实现都挪动到Private类中,而原类的接口实现,都直接去调用Private类的接口,没有必要,这样,除了增加调用层级以外,没有别的好处,调试起来跳来跳去,层级非常的深。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。