Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.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++中的 const 关键字是什么意思?当它写在成员函数的结尾(参数列表之后)?< p>这意味着 *这个< /C> >是“代码> const ,在该成员函数内,即它不改变对象。_C++_Constants - Fatal编程技术网

成员函数末尾的常量是什么意思? > C++中的 const 关键字是什么意思?当它写在成员函数的结尾(参数列表之后)?< p>这意味着 *这个< /C> >是“代码> const ,在该成员函数内,即它不改变对象。

成员函数末尾的常量是什么意思? > C++中的 const 关键字是什么意思?当它写在成员函数的结尾(参数列表之后)?< p>这意味着 *这个< /C> >是“代码> const ,在该成员函数内,即它不改变对象。,c++,constants,C++,Constants,关键字this是一个prvalue表达式,其值为调用函数的对象的地址。类X的成员函数中this的类型是X*。如果成员函数声明为const,则此的类型为const X*。[第9.3.2节§1] 在const成员函数中,通过const访问路径访问调用该函数的对象;因此,const成员函数不应修改对象及其非静态数据成员。[第9.3.2节§2] 这意味着可以在类的const实例上调用const成员函数。无法对[1]一个const对象调用非const成员函数,因为它可能试图修改它 [1] 注意:临时对象

关键字
this
是一个prvalue表达式,其值为调用函数的对象的地址。类
X
的成员函数中
this
的类型是
X*
。如果成员函数声明为
const
,则此
的类型为
const X*
。[第9.3.2节§1]

const
成员函数中,通过
const
访问路径访问调用该函数的对象;因此,
const
成员函数不应修改对象及其非静态数据成员。[第9.3.2节§2]

这意味着可以在类的
const
实例上调用
const
成员函数。无法对[1]一个
const
对象调用非
const
成员函数,因为它可能试图修改它

[1] 注意:临时对象不是
const
对象,除非它是
const
类型。

编译器优化是可能的,但主要的好处是强制执行函数声明中表示的契约-如果将成员函数定义为
常量,编译器将阻止对该函数中的对象进行任何修改


您可以在类中的单个字段的声明中使用
mutable
来免除此限制。例如,当您有一个封装了自己的锁保护的类时,这很有用,即使在
const
成员函数中,锁保护也必须更改其值以强制执行线程安全。

const
在函数签名的末尾意味着函数应该假定它所属的对象是
const
。实际上,这意味着您要求编译器检查成员函数是否以任何方式更改对象数据。这意味着要求编译器检查它是否不直接更改任何成员数据,也不调用任何本身不能保证不会更改对象的函数

创建
const
对象时,要求编译器确保该对象在初始化之后不会发生更改。这反过来意味着编译器将检查您是否不直接更改其成员数据,并且您不会调用任何不保证它不会更改对象的函数


这都是const correction哲学的一部分。从本质上说,这意味着,如果现在一切正常,它们不会改变,那么它们就永远不会崩溃。换句话说,稳定的事物更容易可靠地处理。函数签名末尾的
const
是一个禁止破坏的工具。这反过来意味着您应该尽可能地将
常量放在任何地方。

@Mat:将变量声明为常量:
常量int*ptr=&m_值
@Mat:不,它与优化无关。这都是关于
const
正确性的。任何合理的编译器在应用优化时都将能够自己找出什么是常量。另外,声明成员函数
const
并不能立即帮助编译器,因为
const
可以被
const\u丢弃。在设计库/内部API时,它非常有用,因为它向所述API的用户承诺,此成员函数调用不会干扰数据。还值得注意的是,如果用户出于某种原因拥有该类类型的常量变量,他们只能使用常量成员函数。答案应该是
*这个
是该成员函数中的
常量。const是对象(这个
指向的对象)。实际上,
const
意味着函数承诺不改变对象。它可以规避甚至违反承诺。详细说明按位与逻辑常量可能会有用。对
mutable
的提示也可能是个好主意。谢谢您的解释。有没有反对在不改变对象的函数中使用const的论点?我觉得,如果你突然决定改变一些设计,需要在一个当前声明为常量的函数中调用一个非常量函数,然后可能需要将一大串调用该函数的函数更改为常量,那么软件的可维护性可能会降低。没有人反对使用
const
。也就是说,除非您现在在设计类时知道应该允许成员函数更改对象。这是一个设计问题,你应该尽早问自己,而且应该很容易回答。这不是“以后再开门”的问题。相反,它是关于函数是否应该更改对象。这是一个是/否的问题,黑色或白色,中间没有任何东西,应该很容易回答。注意:这不是关于它是否可以改变对象,而是它是否应该改变。这反过来意味着const-correction哲学迫使你很早就意识到每个函数的作用。它迫使您决定并非常清楚每个成员函数的存在理由。这是件好事。你所要求的是为改变函数存在的理由敞开大门,这是一件坏事。您应该只更改函数如何完成它应该做的事情,而不是它做什么。想想你的API的用户(你自己也是)。别把地毯从他们脚上扯下来!当用户创建
const
对象时,他们只能调用