explicit关键字在C++中意味着什么?
假设我有这个功能:
void my_test()
{
A a1 = A_factory_func();
A a2(A_factory_func());
double b1 = 0.5;
double b2(0.5);
A c1;
A c2 = A();
A c3(A());
}
Run Code Online (Sandbox Code Playgroud)
在每个分组中,这些陈述是否相同?或者在某些初始化中是否有额外的(可能是可优化的)副本?
我见过有人说过这两件事.请引用文字作为证据.还请添加其他案例.
当涉及构造函数时,添加关键字会explicit阻止热情的编译器在不是程序员的第一个意图时创建对象.这种机制是否也适用于铸造操作员?
struct Foo
{
operator std::string() const;
};
Run Code Online (Sandbox Code Playgroud)
例如,在这里,我希望能够投入Foo到一个std::string,但我不希望这种投射是隐含的.
可能重复:
复制初始化和赋值初始化之间的C++是否存在差异?
有什么区别
T a(b);
Run Code Online (Sandbox Code Playgroud)
和
T a = b;
Run Code Online (Sandbox Code Playgroud)
和
T a = T(b);
Run Code Online (Sandbox Code Playgroud)
?
我在教科书和论坛中看到了很多代码,人们在for循环初始化中使用赋值运算符来开始重复.例如,
for ( int i = 0; i < 5; ++i ) // common
for ( int i(0); i < 5; ++i ) // uncommon
Run Code Online (Sandbox Code Playgroud)
我知道初始化变量比分配变量更快.为什么人们更喜欢前者呢?
有些情况下,我想要一个对象的引用,但我得到一个副本.这是一个例子:
std::pair<const std::string, int> foo("hello", 5);
const std::pair<std::string, int> & bar = foo;
std::cout << "foo: " << foo.first << " " << foo.second << std::endl;
std::cout << "bar: " << bar.first << " " << bar.second << std::endl;
foo.second = 7;
std::cout << "foo: " << foo.first << " " << foo.second << std::endl;
std::cout << "bar: " << bar.first << " " << bar.second << std::endl;
Run Code Online (Sandbox Code Playgroud)
这会产生:
foo: hello 5
bar: hello 5
foo: hello 7
bar: hello …Run Code Online (Sandbox Code Playgroud) 可能重复:
隐式VS显式转换
"隐式转换"和"显式转换"之间有什么区别?Java和C++的区别是什么?
我有以下代码
class arr
{
public static void main(String a[])
{
char c='A';
c+=10;
System.out.println(c);
}
}
Run Code Online (Sandbox Code Playgroud)
从java 8编译时,它编译成功.
output ķ
但是当我编译下面的代码时:
class arr
{
public static void main(String a[])
{
char c='A';
c=c+10;
System.out.println(c);
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
logic.java:6: error: incompatible types: possible lossy conversion from int to char
c=c+10;
^
Run Code Online (Sandbox Code Playgroud)
我不明白c=c+10,c+=10为什么我会收到这样的错误?请帮我.谢谢.