数组和指针作为函数参数出现,就像声明一样

时间:2015-01-05 05:31:28

标签: c++ arrays

我对存在/缺席cv的功能不同这一事实感到有些困惑 - 限定符是等价的N4296::13.1/3.4 [over.load]

  

参数声明仅在存在或不存在时有所不同   const和/或volatile是等价的。

示例:

#include <iostream>

void foo(int){ }

void foo(const int){ } //error: redifinition

int main(){ }

DEMO

现在,让我提供一个成员函数的例子。

#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(); }

DEMO

N4296::13.3.1/2 [over.match.funcs]

  

成员函数被认为有一个额外的参数,称为   隐式对象参数,表示其所针对的对象   成员函数被称为

因此,成员函数声明仅在存在const - 限定符时才有所不同,但它们仍然可以重载。这与我之前提供的N4296::13.1/3.4 [over.load]的引用不矛盾吗?

2 个答案:

答案 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(); }

我们会收到错误:只读变量不可分配

请参阅此http://coliru.stacked-crooked.com/