在函数名c ++之后的参数vs const之前的const

const before parameter vs const after function name c++

这样的事情之间有什么区别

1
friend Circle copy(const Circle &);

和这样的事情

1
friend Circle copy(Circle&) const;

我知道const后,函数被用来告诉编译器这个函数不会尝试更改它被调用的对象,那么另一个呢?


第一种形式意味着绑定到作为copy()函数的参数的引用的(状态)Circle对象不会被copy()通过该引用改变。引用是对const的引用,因此无法通过该引用调用Circle的成员函数,而这些函数本身不是const

另一方面,第二种形式是非法的:只有成员函数可以const - 限定(而你宣称有一个全局的friend函数)。

const限定成员函数时,限定条件引用隐式this参数。换句话说,不允许该函数改变它被调用的对象的状态(由隐式this指针指向的对象) - 除了mutable对象,但这是另一个故事。

用代码说出来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
struct X
{
    void foo() const // <== The implicit"this" pointer is const-qualified!
    {
        _x = 42; // ERROR! The"this" pointer is implicitly const
        _y = 42; // OK (_y is mutable)
    }

    void bar(X& obj) const // <== The implicit"this" pointer is const-qualified!
    {
        obj._x = 42; // OK! obj is a reference to non-const
        _x = 42; // ERROR! The"this" pointer is implicitly const
    }

    void bar(X const& obj) // <== The implicit"this" pointer is NOT const-qualified!
    {
        obj._x = 42; // ERROR! obj is a reference to const
        obj._y = 42; // OK! obj is a reference to const, but _y is mutable
        _x = 42; // OK! The"this" pointer is implicitly non-const
    }

    int _x;
    mutable int _y;
};


C ++类方法有一个隐含的this参数,它出现在所有显式参数之前。所以在类中声明的函数如下:

1
2
class C {
  void f(int x);

你可以想象看起来真的像这样:

1
  void f(C* this, int x);

现在,如果你这样声明:

1
  void f(int x) const;

就像你写的那样:

1
  void f(const C* this, int x);

也就是说,尾部const使this参数成为const,这意味着您可以在类类型的const对象上调用该方法,并且该方法无法修改调用它的对象(至少不是通过正常渠道)。


Circle copy(Circle&) const;

使函数const本身。这仅适用于成员函数。

使成员函数const意味着它不能调用任何非const成员函数,也不能更改任何成员变量。它还意味着可以通过类的const对象调用该函数。
这个必须是'Circle'类的成员函数。

1
Circle copy(const Circle &);

而这一个意味着传递的参数不能在函数内改变。这个可能是也可能不是会员功能。


一个参数是函数的另一个参数。

1
Circle copy(const Circle &);

这意味着传入的参数不能在函数内更改

1
Circle copy(Circle&) const;

const限定函数用于成员函数,意味着您无法更改对象本身的数据成员。你发布的例子是荒谬的。

从右向左阅读

如果我们将第一个函数重写为Circle copy(Circle const&);,这意味着相同的事情,很明显从右到左阅读变得有用。 copy是一个对Circle对象进行const引用并通过引用返回Circle对象的函数。


friend Circle copy(const Circle &); //指的是函数的常量参数。不能'改变参数存储的值。

需要在您的示例中删除朋友
圆形副本(Circle&amp;)const;
//无法更改名为Constant成员函数的此poniter值


1
friend Circle copy(const Circle &);

函数调用期间不会更改参数的值。

1
friend Circle copy(const Circle &)const ;

该函数是一个访问器,不会更改任何类成员的值。通常,有一些类型的函数:访问器和增变器。
访问者:检查但不更改其对象的状态。