区分复制和直接初始化

Make difference between copy and direct initialization

创建一个“UnusualClass”class,其中直接初始化和复制初始化自始至终产生不同的效果。特别是,直接或复制初始化的尝试应该在屏幕上打印“直接初始化”或“复制初始化”

#include <iostream>
class UnusualClass{
   public:
   UnusualClass(const int &n){
       std::cout<<"Copy initialization";
   }
   UnusualClass &operator=(const int &n){
       std::cout<<"Direct initialization";
   }
};
int main ()
{
    UnusualClass k1(5); // Should print "Direct initialization"
    UnusualClass k2 = 5; // Should print "Copy initialization"
    return 0;
}

为什么我在这两种情况下都得到了复制初始化?

如何使 UnusualClass k1(5); 打印“直接初始化”而 UnusualClass k2 = 5; 打印“复制初始化”?

我认为一般不可能,但如果您只想支持您列出的两种初始化方式,则有 hacky 解决方案。


您需要两个构造函数,一个 explicit 和另一个 non-explicit。正如评论中已经告诉您的那样,operator= 不会帮助您,因为这两行都执行初始化而不是赋值。

但是,如果两个构造函数之间没有其他差异,代码将无法编译。

您需要使 explicit 构造函数比其 non-explicit 构造函数“更好”,以便尽可能优先使用它(即 direct-initialization),因此另一个是用作后备。

弄清楚如何使一个构造函数比另一个构造函数“更好”留给 reader 作为练习。至少有三种方法:

  • 使用左值引用与右值引用。
  • 使用 ....
  • 使用带有 int 参数的构造函数的助手 class。

根据@HolyBlackCat

的建议

这将按预期工作。

#include <iostream>
class UnusualClass{
   public:
   UnusualClass(const int &n){
       std::cout<<"Copy initialization";
   }
   explicit UnusualClass(const int &&n){
       std::cout<<"Direct initialization";
   }
};
int main ()
{
    UnusualClass k1(5); 
    UnusualClass k2 = 5; 
    return 0;
}