我对存在/缺席cv
的功能不同这一事实感到有些困惑 - 限定符是等价的N4296::13.1/3.4 [over.load]
:
参数声明仅在存在或不存在时有所不同 const和/或volatile是等价的。
示例:
#include <iostream>
void foo(int){ }
void foo(const int){ } //error: redifinition
int main(){ }
现在,让我提供一个成员函数的例子。
#include <iostream>
struct A
{
A(){ }
void foo(){ std::cout << "foo()" << std::endl; }
void foo() const{ std::cout << "foo() const" << std::endl; }
};
A aa;
const A a;
int main(){ aa.foo(); a.foo(); }
N4296::13.3.1/2 [over.match.funcs]
成员函数被认为有一个额外的参数,称为 隐式对象参数,表示其所针对的对象 成员函数被称为
因此,成员函数声明仅在存在const
- 限定符时才有所不同,但它们仍然可以重载。这与我之前提供的N4296::13.1/3.4 [over.load]
的引用不矛盾吗?
答案 0 :(得分:2)
引用的段落(免责声明:我还没有检查引用或归因,但无论如何,C ++的这个属性)是关于正式参数的顶级const
(和volatile
)
例如,
void foo( const int x );
相当于
void foo( int x );
关于呼叫,检查其类型等。这是因为对于调用者而言,正式参数是否为const
是否无关紧要。那个const
- ness只是对函数本身可以做什么的限制,而不是调用者可以做什么。
对于void foo( int )
,您可以使用const
提供实施:
void foo( const int x ) { cout << x << endl; }
它实现了void foo( int )
,因为它们是等效的。
使用const
会员功能,您反而说this
的指示对象是const
。这不是顶级const
。添加const
大致相当于更改
void bar( int* p );
到
void bar( const int* p );
这是两个不同的功能。
答案 1 :(得分:0)
存在巨大差异.Const成员函数意味着您无法修改该函数中的数据。它包含在函数签名中,这就是编译器如何区分。还要归于C++ FAQ
foo()成员函数的尾随const意味着 对象的抽象(客户端可见)状态不会改变。 这与有希望的&#34;原始位&#34;的 对象的结构不会发生变化。不允许使用C ++编译器 采取&#34;按位&#34;解释,除非他们能解决 通常无法解决的混叠问题(即非常数 别名可能存在,可以修改对象的状态。)
#include <iostream>
struct A
{
A(){var=0; }
void foo(){ std::cout << "foo()" << std::endl; }
void foo() const{ std::cout << "foo() const" << std::endl;var=5; } //this will generate error
private:
int var;
};
A aa;
const A a;
int main(){ aa.foo(); a.foo(); }
我们会收到错误:只读变量不可分配