区分复制和直接初始化
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;
}
创建一个“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;
}