gpt4 book ai didi

c++ - 尽可能多地维护 "const-ness"是个好主意吗?

转载 作者:可可西里 更新时间:2023-11-01 14:54:20 27 4
gpt4 key购买 nike

最近,我一直在养成一种习惯,将我的代码中的许多东西作为const:

(1) 函数参数,我知道永远不会改变。例如:

void foo (const int i, const string s)
^^^^^ ^^^^^

(2) 返回类型作为const。例如:

struct A {
...
const int foo () { return ...; }
^^^^^
operator const bool () const { return ...; }
^^^^^
};

(3) 整数或字符串的简单计算。例如:

const uint size = vec.size();
^^^^^
const string s2 = s1 + "hello ";
^^^^^

...还有其他一些地方。通常在其他现实世界的代码中,我看不到标记为 const 的这种小规模变量。但我认为,让它们成为 const 永远不会有坏处。这是一个好的编程习惯吗?

最佳答案

(1) 和(3) 密切相关。按值参数只是一个具有该名称的局部变量,就像您的计算结果一样。

通常,无论您是否将局部变量标记为const,在短函数中都没有什么区别,因为您可以直接看到它们的整个作用域。您可以看到值是否发生变化,您不需要或不希望编译器强制执行它。

不过,有时它确实有帮助,因为它可以防止您意外地将它们传递给通过非常量引用获取其参数的函数,而没有意识到您正在修改变量。因此,如果您在变量的生命周期内将其作为函数参数传递,则将其标记为 const 可以让您更有信心知道它之后的值是什么。

偶尔,将变量标记为 const 可以帮助优化器,因为您告诉它该对象永远不会被修改,有时这是真的,但编译器可以否则证明它。但出于这个原因可能不值得这样做,因为在大多数情况下它没有什么区别。

(2) 是另一回事。正如其他人所解释的那样,对于内置类型,它没有区别。对于类类型,不要按常量值返回。这似乎是个好主意,因为它可以防止用户编写一些毫无意义的东西,例如 func_returning_a_string() += "extra text";。但它也阻止了一些有意义的事情——C++11 移动语义。如果 foo 返回一个 const 字符串,我写 std::string s = "foo";如果(条件)s = foo();,那么我在 s = foo(); 处获得复制分配。如果 foo 返回一个非常量字符串,那么我得到移动赋值。

类似地,在没有移动语义的 C++03 中,它防止了被称为“swaptimization”的技巧 - 使用非常量返回值我可以编写 foo().swap(s); 而不是 s = foo();

关于c++ - 尽可能多地维护 "const-ness"是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8532095/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com