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

这样的事情有什么区别?

friend Circle copy(const Circle &); 

和这样的事情

 friend Circle copy(Circle&) const; 

我知道const函数用于告诉编译器,这个函数不会试图改变它被调用的对象,另一个呢?

第一种forms意味着作为copy()函数参数的引用的Circle对象(的状态copy()不会被copy()通过该引用所改变。 引用是对const的引用,所以不可能通过那些本身没有被限定为const引用来调用Circle成员函数。

另一方面,第二种forms是非法的:只有成员函数可以是const限定的(而你声明的是全局函数)。

const限定一个成员函数时,这个限定就是暗指this参数。 换句话说,那个函数将不允许改变它被调用的对象的状态(隐式指针所指向的对象) – 除了mutable对象之外,这是另外一个故事。

用代码说:

 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 ++类方法有一个隐含的参数,它在所有显式的参数之前。 所以在类中声明的函数是这样的:

 class C { void f(int x); 

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

  void f(C* this, int x); 

现在,如果你这样宣布:

  void f(int x) const; 

这就好像你写这个:

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

也就是说,结尾的const使得this参数为const,这意味着你可以在类types的const对象上调用该方法,并且该方法不能修改它被调用的对象(至less不是通过正常的通道) 。

Circle copy(Circle&) const;

使本身的函数为const。 这只适用于会员function。 使成员函数成为const意味着它不能调用任何非const成员函数,也不能改变任何成员variables。 这也意味着函数只能通过类的const对象来调用。 这个必须是“Circle”类的成员函数。

 Circle copy(const Circle &); 

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

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

 Circle copy(const Circle &); 

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

 Circle copy(Circle&) const; 

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

阅读从右到左

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

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

在你的例子中需要删除朋友Circle copy(Circle&)const; //不能改变这个名为Constant成员函数的poniter值