C++ “是什么意思?”;常数;在函数声明的末尾?
我有一本书,上面写着:C++ “是什么意思?”;常数;在函数声明的末尾?,c++,constants,C++,Constants,我有一本书,上面写着: class Foo { public: int Bar(int random_arg) const { // code } }; 这是什么意思?在函数声明后用关键字const表示的“const函数”使该类函数更改类的成员变量成为编译器错误。但是,在函数内部读取类变量是可以的,但是在函数内部写入将生成编译器错误 考虑这种“常量函数”的另一种方法是将类函数视为普通函数,并使用隐式这个指针。因此,一个方法intfoo::Bar(int
class Foo
{
public:
int Bar(int random_arg) const
{
// code
}
};
这是什么意思?在函数声明后用关键字const
表示的“const函数”使该类函数更改类的成员变量成为编译器错误。但是,在函数内部读取类变量是可以的,但是在函数内部写入将生成编译器错误
考虑这种“常量函数”的另一种方法是将类函数视为普通函数,并使用隐式这个指针。因此,一个方法intfoo::Bar(intrandom\u arg)
(末尾没有常量)会产生一个类似intfoo\u Bar(Foo*this,intrandom\u arg)
的函数,以及一个类似Foo f;f、 条形图(4)
将在内部对应类似于Foo f;Foo_Bar(&f,4)
。现在,在末尾添加常量(int Foo::Bar(int random_arg)const
)可以理解为一个带有常量的声明,该指针:int Foo_Bar(const Foo*this,int random_arg)
。由于这种情况下this
的类型为const,因此不可能修改成员变量
可以放宽“const function”限制,即不允许函数写入类的任何变量。为了允许某些变量即使在函数被标记为“const function”时也是可写的,这些类变量被标记为关键字mutable
。因此,如果一个类变量被标记为可变的,并且一个“const function”写入该变量,那么代码将被干净地编译,并且该变量可能会更改。(C++11)
<>通常在处理<代码> const 关键字时,改变C++语句中const关键字的位置有完全不同的含义。上述const
用法仅适用于在括号后的函数声明末尾添加const
时
const
在C++中是一个被过度使用的限定符:语法和顺序与指针结合起来通常并不简单。有关const
正确性和const
关键字的一些阅读资料:
类似于问题
本质上,它意味着方法Bar
将不会修改Foo
Bar
的非成员变量,并保证不会更改其所调用的对象。例如,在C++ FAQ中看到,我总是发现在概念上更容易想到你正在做这个指针const(这几乎就是它所做的)。
class Boo { ... };
Boo b0; // mutable object
const Boo b1; // non-mutable object
现在您可以在b0
上调用Boo
的任何成员函数,但只有const
-在b1
上的限定成员函数不能通过您给它的指针/引用更改其参数
每当我需要思考时,我都会进入此页面:
我相信Meyers的“更有效的C++”中也有一个很好的章节不要忘记mutable
关键字。它将this
的类型从Foo*const
更改为const Foo*const
。那是有后果的。我不明白你的编辑。你到底想知道什么?如果声明两个Foo类型的变量将创建多个Bar函数实例?@inflagranti:是的,这正是我想知道的。那么答案是否定的。你为什么认为它会是否定的?@aPoC函数(或这里的方法)只在“内存”中存在一次(是否是静态的
,这无关紧要)。它们得到一个隐藏参数this
,它是指向调用实例的指针。实际上,不是this
指针本身是const
,而是它指向的对象,即*this
;)@埃伦,如果你喜欢易变的,你可能会喜欢这个。“mutable”最常见的用例是作为控制类实例访问的互斥体的修饰符。只是因为你承诺不修改这个实例,并不意味着你从它上面读到的东西不会被其他人引用,而是Janick的,我已经在自己的C++学习了一两年,从来没有看到任何书包含这样的解释,我觉得这真的很有帮助。我应该阅读什么样的书来学习这些隐含的这个指针。史提芬:我认为最有用的事情可能是实际阅读C书以及一些类似于OO的东西可以在C中实现。从更简单的角度来看,C++中的原生OO功能如何在C中的更低级结构上进行映射。要注意的另外两点:1)静态数据成员仍然可以修改。2) 此处检查按位常量,这意味着调用函数的对象的内存是逐位检查的,不应对其进行更改。这进一步告诉我们,如果存在int*数据成员,则该指针包含在对象内存中的地址不能更改,但该位置上不属于对象内存的值可以更改。@Lukastiniersch,如果const函数调用non-const函数来更改值,编译器将抛出错误。