这样的东西有什么区别
friend Circle copy(const Circle &);
像这样
friend Circle copy(Circle&) const;
在函数用于告诉编译器之后,我知道const,该函数将不会尝试更改被调用的对象,另一个函数呢?
Answers:
第一种形式意味着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;
};
const
对象,并且我调用like ,那应该发生什么,为什么?由于在调用方中已声明,因此应该不会失败?obj
X
bar()
obj.bar(obj)
obj._x = 42
obj
const
void bar(X const& obj) {...}
)看起来像这样,该怎么办?void bar(const X& obj) {...}
,将const
关键字移到该位置会发生什么变化吗?如果是这样,您也可以添加此示例吗?
const
适用于其左侧的内容,或适用于左侧无内容的右侧的内容。在您的情况下,您会看到两种版本const
都适用于X
。
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对象上调用该方法,并且该方法无法修改对其进行调用的对象(至少不是通过常规通道)。
friend
部分,因为我认为它实际上与OP的实际问题无关(否则,一旦所有问题暴露出来,真正的问题将变成什么)。就这样吧。
让我们清除所有与之相关的混淆 const
const
来自常量,表示某些内容不可更改,但可读性强。
如果我们使用const
关键字限定变量,则以后将无法更改。
例如,const变量必须在声明时进行初始化。
const
int var =25;
var =50; // gives error
如果我们在之后限定指针变量,那么我们不能改变指针本身,但是指针的内容是可变的。
例如
//但是const
*
int *
const
ptr = new int;
ptr = new int; //gives error
*ptr=5445; //allowed
如果在之前用限定指针变量的话,我们可以改变指针本身,但是指针的内容是不能改变的。
例如
//但是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
}
};