像这样的东西有什么区别
friend Circle copy(const Circle &);
和这样的东西
friend Circle copy(Circle&) const;
我知道 const 在函数用于告诉编译器该函数不会尝试更改调用它的对象之后,另一个呢?
第一种形式意味着Circle
绑定到作为函数参数的引用的对象的(状态)copy()
不会被copy()
该引用更改。该引用是对 的引用const
,因此无法Circle
通过该引用调用本身未限定为的成员函数const
。
另一方面,第二种形式是非法的:只有成员函数可以是const
- 限定的(而您声明的是全局friend
函数)。
当const
限定成员函数时,限定指的是隐式this
参数。换句话说,不允许该函数更改调用它的对象(隐式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++ 类方法有一个隐式this
参数,它位于所有显式参数之前。所以在这样的类中声明的函数:
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,这意味着您可以在类类型的 const 对象上调用该方法,并且该方法不能修改调用它的对象(至少,不能通过正常通道)。
让我们清除所有与 const
const
来自常数意味着某些东西是不可改变但可读的。
如果我们用const
关键字限定我们的变量,我们以后不能改变它。
例如,const 变量必须在声明时进行初始化。
const
int var =25;
var =50; // gives error
如果我们用after限定我们的指针变量,那么我们不能更改指针本身,但指针的内容是可变的。
例如
// 但是const
*
int *
const
ptr = new int;
ptr = new int; //gives error
*ptr=5445; //allowed
如果我们用before限定我们的指针变量,那么我们可以更改指针本身,但指针的内容是不可更改的。
例如
// 但是const
*
int
const
* ptr = new int(85);
//or
const
int * ptr = new int(85);
ptr = new int; // allowed
*ptr=5445; // gives error
指针和内容都是常量,
例如
int
const
*
const
ptr = new int(85);
//or
const
int *
const
ptr = new int(85);
ptr = new int; // not allowed
*ptr=5445; // not allowed
Circle copy(const Circle &);
friend Circle copy(Circle&) const;
class A{ public :
int var;
void fun1()
{ var = 50; // allowed
}
void fun2()const
{ var=50; //not allowed
}
};
Circle copy(Circle&) const;
使函数const
本身。这只能用于类/结构的成员函数。
制作成员函数const
意味着
const
对象调用(const
对象只能调用const
函数)。非常量对象也可以调用const
函数。现在考虑下一个:
Circle copy(const Circle &);
而这意味着传递的参数不能在函数内更改。它可能是也可能不是该类的成员函数。
注意:有可能以这样的方式重载一个函数,以拥有const
同一函数的一个和非常量版本。
一个是指参数,另一个是函数。
Circle copy(const Circle &);
这意味着传入的参数不能在函数内更改
Circle copy(Circle&) const;
const
限定函数用于成员函数,意味着您不能更改对象本身的数据成员。您发布的示例是荒谬的。
如果我们将第一个函数重写为Circle copy(Circle const&);
,这意味着同样的事情,很明显从右到左阅读变得有用。copy
是一个函数,它接受一个对象的const
引用Circle
并通过引用返回一个Circle
对象。
friend Circle copy(const Circle &);
//指的是函数的常量参数。不能'改变参数存储的值。
需要在您的示例中删除朋友 Circle copy(Circle&) const; //不能改变这个命名为常量成员函数的指针值
friend Circle copy(const Circle &);
在函数调用期间参数的值不会改变。
friend Circle copy(const Circle &)const ;
该函数是一个不会更改类成员的任何值的访问器。通常,函数有多种类型:访问器和修改器。Accessor:检查但不改变其对象的状态。