C ++中的对象变量包含值,而不是对象引用

时间:2011-01-24 19:29:40

标签: c++ object reference

http://www.horstmann.com/ccj2/ccjapp3.html,在 A3.4下。对象,提到了以下内容:

  

在C ++中,对象变量包含值,而不是对象引用

你能澄清这一点吗?而且,只有C ++中的pointer持有对象引用吗?

我们可以在这里说object referenceobject address吗?

感谢。

8 个答案:

答案 0 :(得分:6)

  

你能澄清这一点吗?

最好通过与例如比较来理解Java或C#:

MyClass a = new MyClass; // creates an instance.
MyClass b = a; // we still have one instance of MyClass in memory

与C ++相反:

MyClass a; // a *is* an instance of MyClass.
MyClass b = a; // we make a copy of a, now there are *two* instances of MyClass.
  

而且,只有C ++中的指针才能保存对象引用吗?

不,也是参考。

  

我们可以在这里说对象引用是对象地址吗?

不,如果你的意思是A&,那么它就是一个实现细节。您也可以使用与C#类似的引用语义来实现对象。 pugixml库中的xml_node就是一个例子:

xml_node root = ...;
xml_node root2 = root; // doesn't copy the document
// root2 refers to the same object as root.

答案 1 :(得分:4)

C ++支持值/指针/引用的概念。如果将值传递给修改参数的函数,则值类似于Java int,原始值不变,这称为值语义。

在Java中,大多数对象都有引用语义,这意味着变量不存储对象,它存储对象的引用,这样如果通过一个引用修改了对象,则所有其他引用都会看到更改。带有引用和指针的C ++也支持这一点。指针是对象的内存地址,引用的行为方式与语义相似(通常用幕后的指针实现)。说引用是对象的地址是不正确的,对象的地址是指向对象的指针。

有关详细信息,请参阅Reference and value semantics

答案 2 :(得分:2)

这可能有点过多细节,但是,确切地说,指针是一个对象变量,它存储另一个对象的地址并且有一个自身的实体:你可以请求指针的地址,你可以修改指针......

引用(C ++意义,而不是Java)不是对象变量(在当前标准中,我相信有一些重写进入c ++ 0x),而是别名到对象。这里有一些技术细节,比如你可以创建对象数组,但不能创建引用数组(引用不是对象)。

现在,如果您来自Java背景,那么您真正需要记住的是(虽然不完全相同)Java变量和C ++指针是类似的东西:它们拥有在某处访问对象的密钥,但是Java中没有C ++引用的概念。这就是您无法在Java中实现swap操作的原因,除了某些特定类型:

template <typename T>
void swap( T & lhs, T & rhs )
{
   T tmp = lhs;
   lhs = rhs;
   rhs = tmp;
}
int main() {
   int a = 1, b = 5; 
   swap( a, b );      // a == 5, b == 1 after this call in this context
}

如果你记住这一点并且你明白在Java中引用是通过值传递的(引用的副本被传递给函数)那么你已经迈出了理解C ++函数调用语义的一个很好的步骤。

答案 3 :(得分:1)

对象引用是对象的永久,固定和隐式地址。而指针是一个可变的显式地址变量。换句话说,引用使用对象的地址来访问对象,但1)它不会使程序员可以使用该地址,2)引用永久地绑定到特定对象。指针可以指向特定类型的任何对象,或者根本不指向任何对象。初始化不是强制性的。此外,由于指针是变量,因此可以随意重新分配。

答案 4 :(得分:1)

是的,在C ++指针中持有对象引用,有&amp;也可以做一个implit参考的运算符。 Java和c ++有不同的行为。 在java:

myobject a;
a = new myobject();

在C ++中:

myobject a;

或      myobject * a;      a = new myobject();

答案 5 :(得分:1)

在C ++中,默认是按值传递和存储对象。所以,如果你有

class A {
    int x[5000];
}

这会创建一个存储5000个int的类型。如果你有一个像这样使用A的类:

class B {
    A content;
};

然后每个B都有一个5000英寸的数组。这与Java这样的语言形成了鲜明的对比,其中的内容类似于指向A的指针。

在C ++中,您可以选择将内容指向A:

class C {
    A* content;
};

或对A

的引用
class D {
    A& content;
};

但你必须明确地这样做。此外,C ++中的引用不能为null,因此如果有可能未定义内容的值,则必须使用指针。

答案 6 :(得分:1)

事实上,C ++中有三种不同的变量。值,引用和指针。第一个,值,意味着如果你定义

int a;

SomeOtherType a;

这意味着您创建了该类型的新对象,并保留内存以存储它。然后,您可以通过编写

将其内容复制到另一个变量
another_variable = a;

如果您使用指针,请执行以下操作:

SomeType *a = &some_existing_variable;

然后如果你说“b = a;”其中a和b都是指针,你不复制任何数据,但你只需要更改指针所指向的对象。参考文献以同样的方式工作。指针和引用之间最重要的区别是引用不能为NULL,必须初始化引用,不能更改引用的值,并且与它们一起使用的语法是不同的。

答案 7 :(得分:1)

解释对象变量和指针变量之间差异的最直观的方法之一是分配内存的位置:对象变量引用堆栈对象,而指针(和引用)可以引用(通常)堆对象。两者结构不同,寿命不同,每种都有各自的优缺点。

查看我文章的“Stack and Heap”部分: http://akos.ma/188y