我在下面的方法中使用了多个const关键字。为什么使用它们?
const int* MyClass::getvalue(const int input) const
如果从方法返回指针,有什么方法可以限制用户更改指针值和指针本身?
答案 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