所以我最近安装了CLion,经过一些设置后,我开始搞乱我写的一些旧代码。现在关于CLion的一个好处就是它可以帮助你编写样式等等。但我发现有一点奇怪的是它建议我拆分变量的定义和赋值。我记得一个特定的情况,我按如下方式定义了字符串:
string path = "mypath";
但是IDE建议把它写成:
string path;
path = "mypath";
现在我开始在网上寻找这两种方法的优缺点。显然前者更快但后者更安全,因为它调用了复制构造函数或其他东西(我没有完全理解那部分)。我的问题基本上是:由于CLion建议采用后一种方式,这是否意味着它总是更好?是否有一种方式优先于另一种方式或是情境方式?他们每个人都有自己的优点/缺点,如果有,他们是什么?
非常感谢任何帮助或可靠的资源。
提前致谢, Xentro
答案 0 :(得分:1)
您的IDE需要托付到垃圾箱。
string path = "mypath";
是无限更好的模式。这是因为,一般来说,不存在path
的不确定值的潜在危险。 (当然,在这种情况下,这不是问题,因为std::string
有一个明确定义的默认构造函数,但首选的方法是进入的好习惯。)
编译器也不用担心构造然后为对象赋值。
答案 1 :(得分:1)
但是IDE建议把它写成:
string path; path = "mypath";
卸载IDE的时间。这个建议完全是胡说八道。
关于它的最糟糕的事情可能是它如何阻止const的正确性。如果path
永远不会更改,那么您应该将其设为const
,并且只有在您使用正确的值立即初始化变量时才能执行此操作:
std::string const path = "mypath";
请注意,根据代码的上下文,您可能还想使用auto
(将变量转换为char指针,因为推导出的"mypath"
类型是char数组,但也许事实证明你甚至不需要一个完整的std::string
? - 而且这只有在你不遵循愚蠢的IDE建议时才有效:
auto const path = "mypath";
显然前者更快
无意义。这不是关于速度,而是关于正确性和代码可维护性。
但后者更安全,因为它调用了复制构造函数或其他东西(我不太了解那部分)。
这也是胡说八道。它调用std::string
's overloaded assignment operators之一,而不是复制构造函数。并且它在任何通常的意义上都不是更“安全”。
答案 2 :(得分:0)
<a href="portfolio_item_2.html"><img class="card-img-top" src="assets/pages/img/works/ads1.png" alt="" style="visibility: hidden !important; display: none !important; opacity: 0 !important; background-position: 0px 0px;" width="0" height="0"></a>
使用复制构造函数
调用上面的代码string path = "mypath";
另一个被调用使用赋值运算符。
理论上,优缺点实际上取决于编译器如何处理代码。所以它从编译器到编译器各不相同。通常,第一种方法是尝试通过复制另一个现有对象来构建对象。第二个是首先创建一个新的空对象,然后使用赋值运算符(“=”,等号)为变量赋值。
您可以在以下链接中查看更多讨论: Why separate variable definition and initialization in C++? 和What's the difference between assignment operator and copy constructor?
答案 3 :(得分:0)
建议是无稽之谈,其他答案已经说明了。
我想为此添加一个来源:直接来自C++
Bjarne Stroustrup的创建者和C ++ Comete的主席(希望我不会让他的位置错误)Herb Sutter:
C ++核心指南:
ES.20: Always initialize an object
原因避免使用之前设置的错误 及其相关的未定义行为。避免问题 理解复杂的初始化。简化重构。实施例
void use(int arg) { int i; // bad: uninitialized variable // ... i = 7; // initialize i }
不,i = 7不会初始化i;它分配给它。另外,我可以阅读 在...部分。更好:
void use(int arg) // OK { int i = 7; // OK: initialized string s; // OK: default initialized // ... }
注意始终初始化规则故意强于在使用语言规则之前必须设置对象。后者更多 轻松的规则,捕获技术错误,但是:
- 导致代码不太可读
- 它鼓励人们在超过必要范围内声明名称
- 导致更难阅读代码
- 通过鼓励复杂的代码导致逻辑错误
- 阻碍重构
始终初始化规则是旨在改进的样式规则 可维护性以及防止使用前设置的规则 错误。