在编写一个C++函数,必须传递参数时,据我所知,如果可以保证对象不会被更改,则应始终使用const,或者如果指针不会被更改,则应使用const指针。
还有哪些情况下建议使用这种做法?
什么时候会使用常量引用,相对于直接通过指针传递它的优点是什么?
那么这个void MyObject::Somefunc(const std::string& mystring)
中的const string有什么意义,因为字符串实际上已经是一个不可变对象了?
在编写一个C++函数,必须传递参数时,据我所知,如果可以保证对象不会被更改,则应始终使用const,或者如果指针不会被更改,则应使用const指针。
还有哪些情况下建议使用这种做法?
什么时候会使用常量引用,相对于直接通过指针传递它的优点是什么?
那么这个void MyObject::Somefunc(const std::string& mystring)
中的const string有什么意义,因为字符串实际上已经是一个不可变对象了?
很不幸,询问是否添加const是一个错误的问题。
void modifies(T ¶m);
void modifies(T *param);
这个问题主要涉及样式:你想让调用看起来像call(obj)
还是call(&obj)
?然而,在两个点上,差异很重要。如果要传递null,则必须使用指针。如果要重载运算符,则不能使用指针。
void doesnt_modify(T const ¶m);
void doesnt_modify(T param);
void optional(T const *param=0);
// vs
void optional();
void optional(T const ¶m); // or optional(T param)
这与上述不修改的情况有关,只是传递参数是可选的。在所有三种情况中,这里的差异最小,因此选择最方便的方式。当然,非const指针的默认值由您决定。
void f(T);
void f(T const);
这些声明实际上是完全相同的函数! 当按值传递时,const只是一个实现细节。 试一下:
void f(int);
void f(int const) {/*implements above function, not an overload*/}
typedef void C(int const);
typedef void NC(int);
NC *nc = &f; // nc is a function pointer
C *c = nc; // C and NC are identical types
void test(int i)
不等同于void test(int const i)
,因为后者不允许修改i的值。 - Dukeconst
,只有在必要时才省略它。使用const
可以使编译器进行优化,并帮助同事理解代码的预期用途(同时编译器也会捕获可能的误用)。const
引用传递给函数,则函数可能会修改它。C++没有内置的不可变性概念,您只能使用封装和const
来模拟它(尽管这永远不会是绝对可靠的)。const
的主要原因。主要原因是要编写正确的代码。const
对象绑定到一个 const
引用上。这里的 const
特性是引用本身的特性,而不是对象的特性。 - Björn Pollexconst
对象作为参数。现在,您使用非“const”对象作为参数调用该函数。这会使对象成为“const”吗?不是的。引用使它在函数中显示为const
,但对象本身并不是const
。我不是C++标准和定义方面的专家,我只是觉得您的术语有点误导。 - Björn Pollex