Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;如果在没有新运算符的情况下初始化,是否将类对象视为值类型?_C++_Value Type_Reference Type - Fatal编程技术网

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;

它没有被当作值类型对待,事实上它是

对象变量存储对对象的引用,C++中对象和引用之间存在重要的区别。默认情况下,赋值实际上是按值进行的

如果希望变量只是一个引用,则可以使用引用或指针类型,具体取决于希望使用它的方式。这些类型被声明为
T*
T&

为了进一步说明这一点:

在Java中,当您说
MyClass obj
时,会创建一个对象,但引用/指针存储在变量
obj


< > C++中,<代码> MyClass obj <代码>创建对象并将其存储在<代码> Obj中。如果您想使用引用/指针,则需要声明变量明晰为“代码> MyCype * Objult< /Cube >或MyCase:Objix< /Cult>。C++对象中的< /P> < P>在没有指针引用的情况下被创建为静态(Stand)变量。动态(堆)变量是需要手动内存管理的指针引用


相比之下,在Java或C#中,几乎所有对象都是引用类型,其行为类似于指针,只是它们是垃圾收集的,而值类型是所有对象的一个特殊子集,通常是不可变的。(C++堆栈变量当然不是不可变的)

简短的解释就在这一关键部分

b = a;
您正在使用复制分配运算符,这意味着此处的符号
=

此运算符的默认行为是应用memberwise copy,因此,如果您不定义/重载自己的运算符,此行将在
a
的所有成员中复制
b
的相应成员中存储的所有值


<> > <代码>新< /Cord>运算符,这是完全不同的故事,它通常用于在堆上分配对象并用指针避免堆栈和不必要的拷贝来管理它们。

< P>而C++不调用对象值或引用类型,值和引用类型的行为在C++中具有等价性。 给定两个对象
a
b
a=b

  • 值类型将
    b
    的内容复制到
    a
    中,使它们保持独立的对象
  • 引用类型将
    b
    的位置复制到
    a
    ,使它们引用相同的对象
  • 对于C++:

    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/)。默认情况下,C++将其类视为值类型并制作深度(元素)副本。p> 但是,您可以将成员变量存储在类中的空闲存储中(在堆上),并自定义(重写)赋值运算符的行为(代码中的b=a)以显示引用类型的行为


    例如,这(以及其他一些“技巧”)就是如何设计共享的_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