在函数名称后的参数与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值