C ++拆分定义和变量赋值

时间:2017-10-27 17:20:42

标签: c++ clion

所以我最近安装了CLion,经过一些设置后,我开始搞乱我写的一些旧代码。现在关于CLion的一个好处就是它可以帮助你编写样式等等。但我发现有一点奇怪的是它建议我拆分变量的定义和赋值。我记得一个特定的情况,我按如下方式定义了字符串:

string path = "mypath";

但是IDE建议把它写成:

string path;
path = "mypath";

现在我开始在网上寻找这两种方法的优缺点。显然前者更快但后者更安全,因为它调用了复制构造函数或其他东西(我没有完全理解那部分)。我的问题基本上是:由于CLion建议采用后一种方式,这是否意味着它总是更好?是否有一种方式优先于另一种方式或是情境方式?他们每个人都有自己的优点/缺点,如果有,他们是什么?

非常感谢任何帮助或可靠的资源。

提前致谢, Xentro

4 个答案:

答案 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
    // ...
}
     

注意始终初始化规则故意强于在使用语言规则之前必须设置对象。后者更多   轻松的规则,捕获技术错误,但是:

     
      
  • 导致代码不太可读
  •   
  • 它鼓励人们在超过必要范围内声明名称
  •   
  • 导致更难阅读代码
  •   
  • 通过鼓励复杂的代码导致逻辑错误
  •   
  • 阻碍重构
  •   
     

始终初始化规则是旨在改进的样式规则   可维护性以及防止使用前设置的规则   错误。