在C ++函数中使用const的区别

时间:2018-09-07 10:01:48

标签: c++

我在下面的方法中使用了多个const关键字。为什么使用它们?

const int* MyClass::getvalue(const int input) const

如果从方法返回指针,有什么方法可以限制用户更改指针值和指针本身?

3 个答案:

答案 0 :(得分:5)

首先,将值(与引用或指针相对)的返回类型设为const是没有用的。无论如何,函数的调用者仍然可以将值复制到非常量变量。对于引用或指针,这意味着无法修改引用/指向的对象。仍然可以将其复制到非恒定对象。

参数为const表示该函数无法更改参数。它部分是信息性的,部分是帮助编译器选择优化的,而对于引用或指针,则意味着引用/指向的内容均不可修改。对于引用,还有一种语义,您可以将临时对象传递给该函数。

最后一个const用于函数本身,并使其仅可以在const个对象上调用。如果您有非常量MyClass对象,则不能在此对象上调用此函数。 const是函数签名的一部分,以及函数名称及其参数类型。这意味着您可以拥有两个具有相同名称和参数的重载函数,一个重载const,另一个不重载。

答案 1 :(得分:3)

  

我在下面的方法中使用了多个const关键字。为什么使用它们?

export SPARK_HOME="/c/tools/spark-2.3.1-bin-hadoop2.7" 
export PATH="$SPARK_HOME/bin:$PATH"  
export JAVA_HOME="/c/Program Files (x86)/Java/jdk1.8.0_181/"

这使返回值常量。没有理由使用const返回值。如果您在此处使用const,某些编译器会发出警告。请注意,相反地,指向const对象的引用或指针将是合理的。

const int MyClass::getvalue(const int input) const
^

这使参数成为常量。值参数是否为const差别不大。 const的一个次要优点是,您可以从声明中知道本地对象不会在整个函数中发生变化,如果函数很复杂,这可能会有所帮助。

const int MyClass::getvalue(const int input) const
                            ^

这使成员函数成为常量。这样可以在类的const实例上调用成员函数,但也可以防止函数修改对象的非可变成员。


  

如果从方法返回指针,有什么方法可以限制用户更改指针值和指针本身?

没有办法限制用户更改您返回给他们的指针对象的值,并且永远不需要这样做。

您可以通过返回指向const的指针来限制用户修改pointe d 对象。

答案 2 :(得分:2)

最后一个const指定getvalue()不会更改被调用的MyClass的实例。

const int input为指定为int的函数getvalue()声明类型为const的参数。其值不能在函数中更改。

在返回类型const中是毫无意义的,因为返回值可以毫无问题地分配给非const限定的int

  

什么是限制用户更改指针值和指针本身的方法?

向后读取声明:

int const * const foo; // foo is a constant pointer to a constant int
int       * const bar; // bar is a constant pointer to a          int
int const *       qux; // qux is a          pointer to a constant int