我们是不是需要显式使用指针类型的 CTOR?

Posted

技术标签:

【中文标题】我们是不是需要显式使用指针类型的 CTOR?【英文标题】:Do we need explicit for CTOR with pointer type?我们是否需要显式使用指针类型的 CTOR? 【发布时间】:2015-11-18 02:09:55 【问题描述】:

在这种情况下我们是否需要explicit

class A

    explicit A(B* b);
;

我认为即使我们不将构造函数标记为explicit,写出来也会是编译错误:

A a = new B(); 

从指针到对象的隐式转换根本不可能通过构造函数实现,对吧?

【问题讨论】:

【参考方案1】:

我们需要显式的指针类型的 CTOR 吗?

如果您在团队中工作,这取决于您和您的团队。它更像是一个编码指南,而不是其他任何东西。语言没有强制要求。

【讨论】:

你的意思是,我在写,编译器无论如何都会捕捉到错误的转换,对吧? 听起来@UpAndAdam 说A a = new B(); 没有explicit 是正常的,而你说即使没有explicit 也不会编译。 @Narek,不,我不是这么说的。 UpAndAdam 说的是正确的。【参考方案2】:

编译将失败 从B*A 的转换将失败。

这正是显式将阻止的事情。

在这种情况下你应该只写A a( new B() );,或者如果你想变得更详细,你可以写A a = A( new B() );

至于根本问题:您是否需要它取决于您和您的团队。通常一个主要问题是:你是否会有一个'int'构造函数(会导致与 * 类型的歧义),你想要发生什么,你是否希望从构造参数发生隐式转换。

【讨论】:

我的答案的顶部是针对如果您确实使用 explicit 关键字该怎么办。如果没有explicit,您可以执行上面的操作,并且不会出错。【参考方案3】:

如果您不希望该构造函数可用于隐式转换,您确实需要explicit。完全有可能让基于构造函数的隐式转换接受指针。

【讨论】:

删除explcit会编译哪些情况。例如A a = new B(); 即使没有explicit也无法编译。

以上是关于我们是不是需要显式使用指针类型的 CTOR?的主要内容,如果未能解决你的问题,请参考以下文章

new和delete,p150

c ++:复制ctor和指针

C11新特性之智能指针

void及void指针介绍

在 C# 中引用类型的内存方面的显式转换解释

为啥宁愿使用指向结构的指针而不是链表中的常规结构类型变量?