Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.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++_Constants - Fatal编程技术网

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函数来更改值,编译器将抛出错误。