C++ C++;:将指向常量对象的指针复制到非常量对象指针

C++ C++;:将指向常量对象的指针复制到非常量对象指针,c++,class,oop,pointers,constants,C++,Class,Oop,Pointers,Constants,在我的自定义类中,我在将输入变量指针声明为常量并将其复制到非常量成员变量指针时出错 我得到的错误是: 无法使用 “const Position*”类型的左值 为什么会发生这种情况?为什么这与其他成员变量(\u attack)不一致?它只是复制指针(地址)的值,复制方式与复制int的值相同(\u attack) 类生物 { 私人: 内部攻击; 位置*\u位置; 公众: 生物(持续攻击,持续位置*位置) :_-attack{attack},_-position{position}//错误:无法使用“

在我的自定义类中,我在将输入变量指针声明为常量并将其复制到非常量成员变量指针时出错

我得到的错误是:

无法使用 “const Position*”类型的左值

为什么会发生这种情况?为什么这与其他成员变量(
\u attack
)不一致?它只是复制指针(地址)的值,复制方式与复制int的值相同(
\u attack

类生物
{
私人:
内部攻击;
位置*\u位置;
公众:
生物(持续攻击,持续位置*位置)
:_-attack{attack},_-position{position}//错误:无法使用“const-position*”类型的左值初始化“position*”类型的成员子对象
{}
};

第一个参数不引用构造函数范围之外的任何内容,因为它只是一个副本。在这种情况下,const只表示构造函数本身不允许更改
攻击的值

第二个参数是指向常量位置的指针。如果可以将其分配给非常量
位置*
,则可以通过非常量指针改变该位置。如果这是允许的,那么如果有人有一个位置指针,而他们不想被你的构造函数改变,他们就没有办法创建你的类的实例

请注意,通过将第二个参数更改为
Position*const Position
,可以使其行为与第一个参数相同。这使指针常量,而不是它所指向的对象


请参阅相关问题。

第一个参数不引用构造函数范围之外的任何内容,因为它只是一个副本。在这种情况下,const只表示构造函数本身不允许更改
攻击的值

第二个参数是指向常量位置的指针。如果可以将其分配给非常量
位置*
,则可以通过非常量指针改变该位置。如果这是允许的,那么如果有人有一个位置指针,而他们不想被你的构造函数改变,他们就没有办法创建你的类的实例

请注意,通过将第二个参数更改为
Position*const Position
,可以使其行为与第一个参数相同。这使指针常量,而不是它所指向的对象

请参阅相关问题。

指针有两种类型的
常量。是的

const T * pointer_name

也可以组合成第三种形式,也就是最后一种形式

const T * const pointer_name
对于第一个,您正在创建一个指向
常量T
的指针。这是您在构造函数中拥有的内容。这与
\u position
的类型相反,它是
T*
,或者更接近于指向非常量
T
的指针。这就是为什么会出现错误。不能将指向常量t的指针的值分配给指向非常量t的指针

使用第二种形式,您的代码可以编译,因为现在您没有指向
const t
的指针,而是指向
t
const
指针。两个指针都指向一个非常量对象,因此可以将一个指针指定给另一个指针

这与
攻击发生的情况相同。虽然它可能是常量,但您仍然可以复制它的值并将其放置到另一个对象中

最后一个表单是指向
const T
const指针,由于第一个from不起作用的原因,它在这里不再起作用


这也是一种进入东海岸与西海岸的康斯特风格。有了上面的西海岸风格,有时要理解它的类型就不那么容易了。相反,您可以使用东海岸样式,如

T const * pointer_name
T * const pointer_name
T const * const pointer_name
现在,它们都从右到左读取确切的类型。

指针有两种类型的
常量。是的

const T * pointer_name

也可以组合成第三种形式,也就是最后一种形式

const T * const pointer_name
对于第一个,您正在创建一个指向
常量T
的指针。这是您在构造函数中拥有的内容。这与
\u position
的类型相反,它是
T*
,或者更接近于指向非常量
T
的指针。这就是为什么会出现错误。不能将指向常量t的指针的值分配给指向非常量t的指针

使用第二种形式,您的代码可以编译,因为现在您没有指向
const t
的指针,而是指向
t
const
指针。两个指针都指向一个非常量对象,因此可以将一个指针指定给另一个指针

这与
攻击发生的情况相同。虽然它可能是常量,但您仍然可以复制它的值并将其放置到另一个对象中

最后一个表单是指向
const T
const指针,由于第一个from不起作用的原因,它在这里不再起作用


这也是一种进入东海岸与西海岸的康斯特风格。有了上面的西海岸风格,有时要理解它的类型就不那么容易了。相反,您可以使用东海岸样式,如

T const * pointer_name
T * const pointer_name
T const * const pointer_name

现在,它们都从右到左读取确切的类型。

对于构造函数的
攻击
参数(声明为
常量
),您是复制给成员变量(
\u attack
)的值,而不是
常量
;但是,对该成员变量的后续修改不会更改所传递参数的值,因此您不会“违背您所做的承诺”

然而,在
位置
参数的情况下,情况就大不相同了:这里的
常量
限定符表示