Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;函数参数或声明中的常量正确性_C++ - Fatal编程技术网

C++ C++;函数参数或声明中的常量正确性

C++ C++;函数参数或声明中的常量正确性,c++,C++,我想知道是否有必要在函数的参数和参数中加入const来实现const的正确性 我的理解是const correction是一种不改变变量的承诺 例如: bool operator==(const rational<T>& rat); bool operator!=(const rational<T>& rat); bool操作符==(const-rational和rat); 接线员=(const-rational和rat); 及 bool操作符==(c

我想知道是否有必要在函数的参数和参数中加入const来实现const的正确性


我的理解是const correction是一种不改变变量的承诺

例如:

bool operator==(const rational<T>& rat);
bool operator!=(const rational<T>& rat);
bool操作符==(const-rational和rat);
接线员=(const-rational和rat);

bool操作符==(constrational&rat)const;
接线员=(const rational和rat)const;
等价物

我认为这主要是因为如果不更改参数,它们不会更改类中的任何内容,或者它们不同,因为您可以更改公共/私有成员的值,但不能传入参数


如果使用不正确,请更正我的术语。

const
结尾适用于
(使其指针指向const),这意味着成员函数不会修改调用它的对象

class Cls {
 public:
  void f() {
    ++x_; // no problem
  };

  void g() const {
    ++x_; // error, can't modify in const member function
  };

 private:
  int x_{};
};
在您的示例中,您希望同时说明参数是const,以及
this
。在
lhs==rhs
中,
lhs
仅当您具有尾随的
const
时才被视为const,因此您可以使用

bool operator==(const rational<T>& rat) const;
bool operator!=(const rational<T>& rat) const;
bool操作符==(constrational&rat)const;
接线员=(const rational和rat)const;
(尽管您可能应该省略

此外,如果省略尾随常量,则无法与左侧的常量对象进行比较

const rational<int> a;
const rational<int> b;
if (a == b) { // error if you don't have the trailing const on operator==
const理性a;
常数有理b;
如果(a==b){//如果没有尾部常量on运算符,则会出现错误==

我对瑞安投了赞成票,现在收回了答案,但为了说明这一点:

bool operator==(rational<T>& rat);
只有
可以更改


无论是
rat
还是
this
都不能更改-这是该特定操作员的预期行为


如USER481301指出的那样,尽可能把所有的东西都作为代码> const < />代码,使得编译器在使用更多的情况下比只使用代码> const 实例更有可能使用它。它也能很好地用于非const。除此之外,优化器可以使用<代码> const 信息。加快可执行文件的速度,以及

const
甚至可能使其编译更快。这两种方法都是因为它缩小了可能涉及的考虑因素,包括运行时和编译期间


如果有疑问,请启动
const

根据放置位置的不同,
const
关键字的位置具有不同的含义。参数前的
const
关键字指定参数为常量,这意味着无法修改参数的值。如果将
const
关键字放在最后,它意味着调用函数的变量的值是常量,因此不能修改

以下是一个例子:

class Foo
{
public:
   void First(const float& something) const;
   void Second(const float& something);
   void Third(float& something) const;
}
在第一个函数中,调用函数的
Foo
类型变量以及
something
变量不能通过调用函数进行修改

在第二个函数中,函数可以修改调用函数的
Foo
类型的变量。这意味着它可以更改其成员,从而更改变量


在第三个函数中,可以修改变量
something
,但不能修改调用该函数的
Foo
类型的变量。例如,如果要修改与
Foo
类型变量的成员有关的值,而不实际更改该值,只更改作为引用传入的变量。

非常相关:“常量正确性是不更改变量的承诺”--什么的承诺?对什么的承诺?我认为这意味着将一个参数或函数标记为const是一个“对编译器的命令”,在代码违反时报告一个错误。程序员对程序员的承诺。如果他们违背了承诺,编译器可以调用他们。在被迫执行其他操作之前,最好使用all
const
版本se.从逻辑上讲,这与大多数人的期望更为一致,即比较不会改变被比较函数的值,并且如果函数被修改为意外更改值,它可能有助于防止将来插入错误。此外,由于
常量,因此您可以在可修改和不可修改的实例。@user4581301的确!添加了一点注释。“参数前的const关键字指定该参数为常量,”-如果之前不存在其他参数,对吗?如果是特定的。
parameter,可能值得一提
bool operator==(const rational<T>& rat); // equivalent to the below
bool operator==(rational<T> const& rat); // equivalent to the above
bool operator==(rational<T>& rat) const;
bool operator==(const rational<T>& rat) const; // equivalent to the below
bool operator==(rational<T> const& rat) const; // equivalent to the above
class Foo
{
public:
   void First(const float& something) const;
   void Second(const float& something);
   void Third(float& something) const;
}