请考虑以下事项:
class A
{
public:
int xx;
A(const A& other)
{
cout << "A cctor" << endl;
/* do some stuff */
}
A(int x) : xx(x) {} /* conversion constructor */
};
int main()
{
A a = 1;
A other = a;
return 0;
}
在这种情况下(以及一般情况下)说CCtor从const转换为非const是正确的吗?
谢谢,罗恩
答案 0 :(得分:5)
复制构造函数创建现有对象的新副本,该对象可能是const,也可能不是const。 A::A(const A& other)
中的const只是说我们不会在复制文件中更改other
。实际上,如果你试图修改ctor中的其他内容,编译器会向你抱怨。
创建的对象也可能是const,也可能不是const,具体取决于您的声明方式。
答案 1 :(得分:0)
构造函数初始化新副本。从常量复制没有问题。
不涉及转换。
答案 2 :(得分:0)
你是什么意思 CCtor从const转换为非const ?
如果你的意思是,通过调用copy-constructor从const对象创建非const对象,然后是yes。但这并不意味着const-object本身在复制构造函数(或调用站点)内变为非const。它只表示通过复制将现有对象作为 const引用传递给复制构造函数来创建新构造的对象。
答案 3 :(得分:0)
复制构造函数不会通过将另一个类对象作为参数来创建类对象的副本。
因为为了构造传递的新对象,因为参数不需要修改,所以它作为const
传递。
答案 4 :(得分:0)
不知道你的意思。 A(const A&)
是一个典型的copy-ctor,它具有对其唯一参数的“只读”访问权限。如果你传递任何const,一切都很好。如果你传递非const的任何东西,对于ctor来说它变成了const。正如你所说,A a = 1
是一个转换者。 A other = a
是副本。有什么问题?
关于您的问题标题,在C ++中没有合理方式将const
转换为非const
。
class A
{
public:
int xx;
A(const A& other)
{
cout << "A cctor" << endl;
/* do some stuff */
// other is const here - you can only call its
// const methods and read all its data members
}
A(int x) : xx(x) {} /* conversion constructor */
// at this point, x is not const, but it's a copy
// of an object you've passed here, not the object itself
// you can change x, it just doesn't matter - you
// change the copy
};
int main()
{
A a = 1; // a is not const, 1 is passed "by value", since it's primitive type
A other = a; // a is not const, other is not const, a is passed by const reference
return 0;
}
答案 5 :(得分:0)
不,它没有转换为非const
对象。考虑一下:
A a(42);
const A another = a;
此处,another
是一个const
对象,是从非const
对象创建的。
但更重要的是, 构造函数会从现有构建器创建新对象 。新对象是否为const
不依赖于现有对象。 const
/非 - const
旧/新对象的所有四种可能组合都是可能的。
答案 6 :(得分:0)
在A(int)
构造函数从int
转换为A
的意义上,是的,您的副本ctor A(const A&)
“从const A
转换为” A
。就此而言,它也会从非const A
“转换”为A
,因为const引用参数可以绑定到其中。
由于使用相同的构造函数来创建const对象以创建非const对象,因此该复制ctor也可以从A
或const A
“转换”为const A
我在引号中使用了“convert”只是因为从类型转换为自身或者本身的cv限定版本可能是对该术语的混淆使用,通常你只是称之为“复制”而不是转换。 / p>
构造函数参数也可以绑定到派生类A
的实例,因此您可以说它将派生类转换为A
。这通常被称为“切片”。
严格来说,复制ctor本身并不能转换任何内容,但转换为A
(无论是强制转换还是隐式转换)确实依赖于使用匹配的构造函数。所以我认为构造函数可以获得很大一部分功劳。