如果在没有new运算符的情况下进行初始化,C++是否会将类对象视为值类型?

Kor*_*gay 1 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;
Run Code Online (Sandbox Code Playgroud)

输出:

5
5
5
10
Run Code Online (Sandbox Code Playgroud)

如果a和b是引用类型,那么最后2行将是10和10而不是5和10我猜.

当你做这样的声明时,这是否意味着:

AClassType anInstance;
Run Code Online (Sandbox Code Playgroud)

它被视为一种价值类型?

------这是MyItemType.h ------------

#ifndef MYITEMTYPE_H
#define MYITEMTYPE_H

class MyItemType{

public:
    int someNumber;
    MyItemType();
};

MyItemType::MyItemType(){
}

#endif  /* MYITEMTYPE_H */
Run Code Online (Sandbox Code Playgroud)

Luc*_*ore 7

基本上,是的(如果你认为C++相当于与Java中的相同).

AClassType anInstance;是一个对象,而不是一个参考.MyItemType a并且 MyItemType b它们是不同的对象,它们驻留在不同的存储空间中,因此显然改变为一个不会影响另一个.

执行此操作时a=b,不会将一个对象引用另一个对象,但在这种情况下,请执行成员分配.这基本上就像说

a.someNumber = b.someNumber;
Run Code Online (Sandbox Code Playgroud)


Zan*_*ane 5

它不被视为值类型,事实上它是。

虽然在 Java 对象变量中存储对对象的引用,但在 C++ 中,对象与其引用之间存在重要区别。默认情况下,分配实际上是按值进行的。

如果你想让一个变量只是一个引用,你可以使用引用或指针类型,这取决于你想用它做什么。这些类型被声明为T*T&

为了进一步说明这一点:

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

在 C++ 中,MyClass obj创建对象并将其存储在obj. 如果要使用引用/指针,则需要将变量显式声明为MyClass* objPointer or MyClass& objReference