C++ C++;函数参数或声明中的常量正确性
我想知道是否有必要在函数的参数和参数中加入const来实现const的正确性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 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是一个“对编译器的命令”,在代码违反时报告一个错误。程序员对程序员的承诺。如果他们违背了承诺,编译器可以调用他们。在被迫执行其他操作之前,最好使用allconst
版本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;
}