显式调用构造函数

2024-04-20

我知道我们可以调用构造函数的概念Explicitly and Implicitly,我已经测试了这两种情况(通常到目前为止,我的所有目的都通过调用构造函数来实现Implicitly),但我想知道每当我们创建时构造函数都会被隐式调用objects,那么调用构造函数的主要原因是什么Explicitly。当我们调用构造函数时它有什么优点或缺点Explicitly超过Implicit Call?

Example

class integer
{
   int m ,n;
 public:
   integer (int x , int y); 
};
integer :: integer (int x , int y )
{
   m=x; n = y;
}

现在如果我打电话

integer int1 = integer( 0 , 100); //  Explicit Call
integer int1(1,100); // implicit call

这里有两个不同的问题,正如你的定义一样explicit and implicit与标准定义不匹配(大多数现有答案都基于标准定义,在添加包含您自己的定义的示例之前编写)explicit and implicit).

好的,让我们首先考虑一下你的定义explicit,这将是(我猜你称之为explicit因为你明确地写了类型名称?):

integer int1 = integer(0, 100);

与你的定义implicit这将是:

integer int1(1, 100);

在这种情况下,第一个“明确”call 确实比第二个没有任何优势“隐含的”称呼。但还是有区别的。第一个实际上使用双参数构造函数创建一个临时对象,然后用它来创建int1使用复制构造函数。尽管实际上编译器通常会优化掉这个额外的副本,但如果您的复制构造函数是私有的,它仍然无法工作,而第二个仅需要双参数构造函数(您甚至可以将其视为缺点)。


但现在来看看实际的标准定义explicit and implicit. An explicit构造函数调用是您显式调用的任何构造函数调用。实际上,每当您使用括号语法时()要创建一个对象,您显式调用构造函数,否则它是一个implicit构造函数调用(也就是说,由编译器在幕后完成):

integer int1;                   // implicit default constructor
integer int1(1, 100);           // explicit two-arg constructor
integer int1 = integer(0, 100); // explicit two-arg constructor, implicit copy constructor

void func(integer);             // function taking by-value
func(int1);                     // implicit copy constructor

所以唯一可以调用的构造函数隐含地是默认构造函数和任何单参数构造函数(包括复制和移动构造函数)。在这方面的一个特殊问题是单参数构造函数不是复制/移动构造函数:

struct integer
{
    integer(int);
};

这允许编译器隐含地调用构造函数来转换类型,因此任何int可以隐式转换为integer:

void func(integer);
func(42);             // implicit call to int-constructor

要禁止这种行为,您必须标记构造函数explicit:

struct integer
{
    explicit integer(int);
};

这只允许它被调用明确地 (e.g. func(integer(42)))(但我想你已经知道了)。这样做的优点是它不会在幕后引入未被注意到/不需要的转换,这可能会导致各种难以发现的问题和有关重载解析的模糊性。因此,通常的做法是标记任何转换构造函数(单参数非复制/移动构造函数)explicit,很可能也是 C++11 最终引入的原因explicit转换运算符。


所以综上所述,根据你的定义和例子,使用确实没有任何优势integer int1 = integer(1, 100);代替integer int1(1, 100);,尽管它会产生(通常无关紧要的)差异。

但根据标准定义,explicit构造函数调用有很多优点implicit,因为这是实际构造对象的唯一方法明确地就是使用一个,嗯,显式构造函数调用, 然而隐式构造函数调用仅在某些情况下在幕后完成,并且仅适用于零参数和一参数构造函数(如阿舍普勒已经指出了)。并将转换构造函数显式标记为explicit具有禁止在幕后进行不需要的隐式转换的优点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

显式调用构造函数 的相关文章

随机推荐

  • 在其他列定义的窗口内累积应用

    我试图将函数累积地应用于由 开始 和 完成 列定义的窗口内的值 因此 开始 和 完成 定义了值处于 活动 的时间间隔 对于每一行 我想获得当时所有 活动 值的总和 这是一个 暴力 示例 它实现了我想要的功能 是否有更优雅 更快或更有效的内存
  • store.sync() 回调

    store sync 有回调吗 我正在尝试这样做 store sync function alert 1 但它不起作用 这家店是当地的一家店 sync 没有 回调 为了实现此行为 您需要监听存储的写入事件 查看这个解决方案 https st
  • 如何在 awk 中对模式进行 if else 匹配

    我尝试过以下命令 awk search pattern print 1 如何编写上述命令的 else 部分 经典方式 https www gnu org software gawk manual gawk html If Statement
  • React Native 中的响应式图像

    我从 Facebook API 获取一些图像 我想将它们显示为响应式 宽度为 100 高度为自动 问题似乎是 React Native 裁剪了我的图像 我尝试了这些解决方案 解决方案1 https stackoverflow com a 3
  • iOS:同时使用 WiFi 和移动数据

    Setup 我的项目涉及一个 WiFi 相机 它创建一个 WiFi 热点 为了在相机上流式传输视频预览 浏览媒体 用户需要连接到相机的热点 Problem 用户无法同时使用 3G 4G 上的蜂窝数据 因为 iOS 设备已通过 WiFi 连接
  • SSLHandshakeException:握手期间远程主机关闭连接

    论坛上充斥着这个问题 但我找不到解决方案 我尝试连接 WS 但没有成功 我尝试更新 cacerts 文件 但没有效果 日志是 Allow unsafe renegotiation false Allow legacy hello messa
  • Code::Blocks 中的 wxWidgets 字体错误“GetWeightClosestToNumericValue() 中断言“numWeight > 0”失败”

    最近 每当我使用 Code Blocks 时 都会不断弹出错误对话框 它显示 此应用程序中的调试错误已失败 和 include wx font h 282 在 GetWeightClosestToNumericValue 中断言 numWe
  • 使用 com.zaxxer.hikari.HikariDataSource 时出错

    我在将 HikariCP 与 Spring 的 JdbcTemplate 集成时遇到错误 我正在使用 Spring 3 2 2 HikariCP 2 3 8 和 sybase jconn4 版本 7 0 0 弹簧配置
  • 为什么 cppreference 将 type_traits xxx_v 快捷方式定义为内联 constexpr 而不仅仅是 constexpr?

    为什么 cppreference 将 type traits xxx v 快捷方式定义为inline constexpr不仅仅是constexpr 例如 参见is integral v http en cppreference com w
  • 在 shell 中用字符串替换变量

    我将一个字符串作为参数传递给 shell 脚本 shell 脚本应该告诉我传递的参数是否是变量 像这样的东西 if z 1 then echo yes 1 is a variable and its value is 1 fi 但这给了我严
  • python子进程在引号前发送反斜杠

    我有一个字符串 它是一个应该在命令行中执行的框架命令 cmdToExecute TRAPTOOL a 字符串 ABC o 字符串 XYZ 我正在考虑该字符串具有应从命令提示符触发的整个命令 如果仔细查看字符串 cmdToExecute 您可
  • MySQL表不存在错误,但它确实存在

    有谁知道什么条件下可以收到1146 Table
  • 如何覆盖 sbt 中对某些任务的依赖

    我想在某些任务中覆盖对项目的依赖 我有一个使用 Spark 的 sbt 多项目 lazy val core Some Project val sparkLibs Seq org apache spark spark core 1 6 1 v
  • 实体框架中的集合值参数?

    在我的上一个项目中 我决定使用实体框架 一切都很顺利 直到我尝试使用 在哪里 我收到一个错误 经过一番小小的搜索后我想出了这个帖子 https stackoverflow com questions 110314 linq to entit
  • 调用 Pyramid 中的另一个视图

    我的目标 在 Pyramid 中 调用另一个可调用视图 并获得一个Response在不知道有关该视图可调用的任何详细信息的情况下拒绝返回 在我的 Pyramid 应用程序中 假设我有一个使用 view config 装饰器定义的视图 foo
  • Azure 函数中的内存缓存

    需要缓存对象以提高我的 Azure 函数的性能 我尝试了 NET ObjectCache System Runtime Caching 它在我的测试中运行良好 测试的缓存保留期长达 10 分钟 为了推进这个解决方案 我有几个简单的问题 Az
  • 如何为网页上的文本绘制添加动画效果?

    我想要一个网页 其中有一个居中的单词 我希望用动画绘制这个单词 以便页面以与我们相同的方式 写 出该单词 即它从一个点开始 随着时间的推移绘制直线和曲线 以便最终结果是一个字形 我不在乎这是否完成
  • 断言列表时,assertEquals 到底检查什么?

    在我的测试中 我断言我返回的列表是我刚刚创建的列表按字母顺序排列的列表 assertEquals 到底检查什么 它检查列表的顺序还是仅检查其内容 因此 如果我有一个 Fred Bob Anna 列表 那么列表中的 2 个 Anna Bob
  • JavaScript 中 FileReader 的异步/等待问题

    我在 Vue js 项目中使用 FileReader 并且此代码有问题 async uploadDocuments files for let file of files let fileName file name let fileCon
  • 显式调用构造函数

    我知道我们可以调用构造函数的概念Explicitly and Implicitly 我已经测试了这两种情况 通常到目前为止 我的所有目的都通过调用构造函数来实现Implicitly 但我想知道每当我们创建时构造函数都会被隐式调用object