回答
是和
首先是明确初始化号,第二个是拷贝初始化。该标准允许用第一个替换第二个。实际上,生成的代码是相同的。
下面是简而言之会发生什么:
std::string s1("foo");
形式的字符串构造:
string (const char * s);
被调用s1
。
在第二种情况下。创建一个临时对象,并为该临时对象提供所述的构造函数。然后,复制构造函数被调用。例如:
string s1 = string("foo");
在实践中,第二种形式被优化,成为第一种形式。我还没有看到一个不优化第二种情况的编译器。
没有区别
第一个比较好。
第二个将创建实例并将分配默认值(“”)。然后会有一个secodn分配:“foo”。 所以2的作业,而不是1 ...
不,第二个不会调用赋值运算符。 – 2010-02-03 13:48:32
表面上,第一个调用const char*
构造函数来初始化s1
。第二个使用const char*
构造函数初始化一个临时值,然后使用复制构造函数传入对该临时值的引用,以初始化s2
。
然而,标准明确允许所谓的“复制省略”,这意味着,阿拉克说,第二个可以合法地与第一更换,即使拷贝构造函数具有可观察到的副作用,这样的变化影响程序的输出。
但是,当这个替换完成后,编译器仍然必须检查该类是否有可访问的拷贝构造函数。所以一个潜在的区别是第二种形式需要一个拷贝构造函数来调用,即使编译器不需要调用它。很明显std::string
确实有一个,所以在这种情况下,这并没有什么区别,但对于其他类可以。
你得到了我的+1“标准明确允许所谓的”复制elision“;) – AraK 2010-02-03 14:03:09
小招供:在发布后,我注意到它是在索引中的”复制构造函数elision“,但据我记得我已经提到它作为“复制elision”:-) – 2010-02-03 18:04:53
- 1. 初始化字符串时'...'和“...”有什么区别?
- 2. 这两种初始化方式之间有什么区别字符串
- 3. C字符串和C++字符串有什么区别?
- 4. 初始化字典和在Swift中声明有什么区别?
- 5. Java中静态初始化和动态初始化有什么区别?
- 6. 在.NET中初始化字符串和不初始化字符串之间的区别
- 7. 为什么字符串需要用初始值初始化?
- 8. 在C#中的区别是什么:字符串VS字符串
- 9. 使用字符串文字和不同字符列表初始化数组声明时有什么区别?
- 10. 初始化字符缓冲区在C++
- 11. 两个字符串有什么区别?
- 12. Python字符串格式化中%s和%d有什么区别?
- 13. 打印和格式化字符串文字有什么区别?
- 14. 在C中创建字符串的方法有什么区别?
- 15. C++ 11字符串初始化
- 16. 用argv初始化C++字符串
- 17. 的C#初始化字符串数组
- 18. 这两种初始化PHP类的方法有什么区别?
- 19. Swing窗口可以初始化的方式有什么区别?
- 20. 初始化驱动程序时module_init和subsys_initcall有什么区别?
- 21. 类初始化的两种方式有什么区别?
- 22. 这个初始化方法有什么区别?
- 23. 初始化前端控制器,这两个有什么区别
- 24. 这两个Ruby类初始化定义有什么区别?
- 25. 这两个初始化有什么区别?
- 26. 字符串初始化
- 27. 字符串初始化
- 28. Android字符串初始化
- 29. 初始化“的字符串”
- 30. 字符串和字符串有什么区别?
拷贝构造函数不会在第二种情况下被调用,只会调用字符串(const char * s)。这是复制初始化。检查:[how-c-implicitly-convert-c-style-string-to-a-string-object](http://stackoverflow.com/questions/35568612/how-c-implicitly-convert-c-style-字符串到字符串对象) – expoter 2016-02-23 05:36:09