C++ C++;如果在没有新运算符的情况下初始化,是否将类对象视为值类型?
示例代码:C++ C++;如果在没有新运算符的情况下初始化,是否将类对象视为值类型?,c++,value-type,reference-type,C++,Value Type,Reference Type,示例代码: MyItemType a; MyItemType b; a.someNumber = 5; b = a; cout << a.someNumber << endl; cout << b.someNumber << endl; b.someNumber = 10; cout << a.someNumber << endl; cout << b.someNumber << endl;
MyItemType a;
MyItemType b;
a.someNumber = 5;
b = a;
cout << a.someNumber << endl;
cout << b.someNumber << endl;
b.someNumber = 10;
cout << a.someNumber << endl;
cout << b.someNumber << endl;
如果a和b是引用类型,那么最后两行应该是10和10,而不是5和10
这是否意味着当您这样做声明时:
AClassType anInstance;
它被视为值类型
------这是MyItemType.h------------
基本上是(如果你认为C++等价于java中的意思)。
aclassinistance类型代码>是一个对象,而不是引用<代码>我的项目类型a
和
MyItemType b
是不同的对象,它们驻留在不同的内存空间中,因此对其中一个对象的更改显然不会影响另一个对象
执行a=b
时,不会将一个对象引用到另一个对象,但在本例中,会执行按成员分配的操作。基本上就像说
a.someNumber = b.someNumber;
它没有被当作值类型对待,事实上它是
T*
和T&
为了进一步说明这一点:
在Java中,当您说MyClass obj
时,会创建一个对象,但引用/指针存储在变量obj
中
< > C++中,<代码> MyClass obj <代码>创建对象并将其存储在<代码> Obj中。如果您想使用引用/指针,则需要声明变量明晰为“代码> MyCype * Objult< /Cube >或
相比之下,在Java或C#中,几乎所有对象都是引用类型,其行为类似于指针,只是它们是垃圾收集的,而值类型是所有对象的一个特殊子集,通常是不可变的。(C++堆栈变量当然不是不可变的) 简短的解释就在这一关键部分
b = a;
您正在使用复制分配运算符,这意味着此处的符号=
此运算符的默认行为是应用memberwise copy,因此,如果您不定义/重载自己的运算符,此行将在a
的所有成员中复制b
的相应成员中存储的所有值
<> > <代码>新< /Cord>运算符,这是完全不同的故事,它通常用于在堆上分配对象并用指针避免堆栈和不必要的拷贝来管理它们。 < P>而C++不调用对象值或引用类型,值和引用类型的行为在C++中具有等价性。 给定两个对象
a
和b
,a=b
:
b
的内容复制到a
中,使它们保持独立的对象李>
b
的位置复制到a
,使它们引用相同的对象MyClass a; // value type
MyClass b; // value type
MyClass &c = a; // reference type (a reference in C++), fixed to a
MyClass *d = &b; // reference type (a pointer in C++)
a = b; // copy content of b into a
c = b; // copy content of b into a
d = &a; // set d to refer to a
*d = b; // copy content of b into a
指针/引用可以是对值对象、由<代码>新< /COD>分配的对象或其他内存管理方案(例如:代码> MALLC 或Win32 < COD> COTASKMLOLC/
例如,这(以及其他一些“技巧”)就是如何设计共享的_ptr智能指针。它是一个C++类,每个实例引用相同的原始数据,不管复制的频率是多少。 C++中的所有内容都是一个值类型,除了显式引用。当您将<代码> <代码> > <代码> b>代码>时,调用默认的复制赋值操作符。C++没有值类型和引用类型。code>operator=在对象上执行memberwise复制(如果可以的话)。
b = a;
MyClass a; // value type
MyClass b; // value type
MyClass &c = a; // reference type (a reference in C++), fixed to a
MyClass *d = &b; // reference type (a pointer in C++)
a = b; // copy content of b into a
c = b; // copy content of b into a
d = &a; // set d to refer to a
*d = b; // copy content of b into a