Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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++_Object_Reference - Fatal编程技术网

C++ C++;保留值,而不是对象引用

C++ C++;保留值,而不是对象引用,c++,object,reference,C++,Object,Reference,在:,A3.4下。对象,其中提到了以下内容: 在C++中,对象变量保存值,而不是对象引用< /p> 你能澄清这一点吗?而且,C++中只有“代码>指针”保存对象引用吗?< /P> 我们可以在这里说对象引用是对象地址 谢谢。C++支持值/指针/引用的概念。值类似于Javaint如果将其传递给修改参数的函数,则原始值不变,这称为值语义 在Java中,大多数对象都具有引用语义,这意味着变量不存储对象,而是存储对对象的引用,因此,如果通过一个引用修改对象,则所有其他引用都会看到更改。C++中还引用了引用和

在:,A3.4下。对象,其中提到了以下内容:

<>在C++中,对象变量保存值,而不是对象引用< /p> 你能澄清这一点吗?而且,C++中只有“代码>指针”<代码>保存对象引用吗?< /P> 我们可以在这里说
对象引用
对象地址


谢谢。

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

在Java中,大多数对象都具有引用语义,这意味着变量不存储对象,而是存储对对象的引用,因此,如果通过一个引用修改对象,则所有其他引用都会看到更改。C++中还引用了引用和指针。指针是对象的内存地址,引用的行为在语义上类似(通常在幕后使用指针实现)。如果说引用是对象的地址,那么对象的地址就是指向对象的指针,这是不正确的


有关详细信息,请参见。

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

你能澄清这一点吗

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

与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++中持有对象引用的指针?< /P> 不,我也是

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

不,如果您指的是
a&
reference,那么它是一个实现细节。此外,您还可以使用类似于C#的引用语义实现对象xml_节点,就是一个例子:

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

是的,在C++指针中保存对象引用,也有操作符和操作符做隐含引用。 java和C++有不同的行为。 在java中:

在C++中:

myobject a;
或 myobject*a;
a=新的myobject()
class A {
    int x[5000];
}
这将创建一个存储5000整数的类型。如果您有一个类使用了like so:

class B {
    A content;
};
那么每个B中都有一个5000整数的数组。这与Java这样的语言形成了对比,Java的内容类似于指向a的指针

<>在C++中,你可以选择让内容指向一个:

class C {
    A* content;
};
或引用

class D {
    A& content;
};

但你必须明确地这样做。另外,C++中的引用不能为空,所以如果内容的值不明确,则必须使用指针。

< P>实际上C++中有三种不同的变量。值、引用和指针。第一个值的意思是,如果定义

int a;

这意味着您创建了一个新的该类型的对象,并保留了存储该对象的内存。然后,您可以通过写入将其内容复制到另一个变量

another_variable = a;
如果改用指针,如下所示:

SomeType *a = &some_existing_variable;

然后,如果你说“b=a”,其中a和b都是指针,你不会复制任何数据,只会更改这些指针指向的对象。参考文献的工作方式大致相同。指针和引用之间最重要的区别是引用不能为NULL,必须初始化引用,不能更改引用的值,并且使用的语法不同。

这可能有点太详细了,但准确地说,指针是一个对象变量,它存储另一个对象的地址,并具有自身的实体:您可以请求指针的地址,您可以修改指针

引用(C++sense,而不是Java)不是对象变量(在当前的标准中,我相信在C++0x中有一些重写),而是对象的别名。这方面有一些技术细节,例如可以创建对象数组,但不能创建引用数组(引用不是对象)

java java,现在你需要从Java背景中来,你需要记住的是(虽然不是完全相同)Java变量和C++指针是类似的:它们持有访问某处对象的密钥,但是C++引用的概念在Java中是不可用的。这就是您无法在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
}
模板
无效掉期(T&lhs、T&rhs)
{
T tmp=lhs;
lhs=rhs;
rhs=tmp;
}
int main(){
INTA=1,b=5;
swap(a,b);//a==5,b==1
}

如果您记住了这一点,并且理解Java中的引用是通过值传递的(引用的副本传递给函数)然后,你已经很好地理解了C++函数调用语义。

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

查看我文章的“堆栈和堆”部分:

another_variable = a;
SomeType *a = &some_existing_variable;
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
}