2

我已经阅读了针对想要学习 C++ 的 Java 开发人员的快速教程。它只解释了 C++ 的基本原理(和语法)(我猜)。起初我以为我已经完全理解了一切,但是在编写 C++ 时出现了一些对我来说并不是很清楚的东西。

和...有什么区别

ExampleClass* doSomething(ExampleClass* ec) {}

ExampleClass* doSomething(ExampleClass& ec) {}

ExampleClass& doSomething(ExampleClass* ec) {}

ExampleClass& doSomething(ExampleClass& ec) {}

?

4

4 回答 4

1

指针和引用有相似之处。它们都指向或引用一个对象,而没有空间来表示对象本身的值。然而,指针显式地使用*to 取消引用(作为一元运算符),并&获取对象的地址。*也用于不同的上下文中,以指定指针类型。

该引用是一个更安全的“自动”指针。然而,引用是不可变的,因为它以后不能更改为指向其他东西。引用也使用该&符号,但在不同的上下文中。它不是一元运算符,而是用于指定引用类型。

第一个示例采用指向 ExampleClass 的指针并返回指向 ExampleClass 对象的指针。例如。你可能会说:

ExampleClass* doSomething(ExampleClass* ec) {
  return ec;
}
ExampleClass * pointer = new ExampleClass();
ExampleClass * anotherpointer = doSomething(pointer);

相比之下,以下内容改为引用 ExampleClass。引用就像一个指针,但这意味着你不传递指针类型的东西,只是直接传递它,例如:

ExampleClass* doSomething(ExampleClass& ec) {
  return &ec; // & unary operator - get the address of ec
}

ExampleClass obj = ExampleClass();
ExampleClass* pointer = doSomething(obj); // it will automatically get a reference to the input object

下一个示例接受一个指针并返回一个引用(注意返回类型不是指针):

ExampleClass& doSomething(ExampleClass* ec) {
  // note ec of is type ExampleClass*
  // *ec is of type ExampleClass
  return *ec; // returns a reference to whatever the pointer points to
}
ExampleClass * pointer = new ExampleClass();
ExampleClass& myobj = doSomething(pointer);

你只需将它传递给一个引用对象(它指向函数给出的对象,即不复制)。请注意,在这种情况下,函数应该注意确保为对象分配了空间,并且不需要在 return 语句中显式引用(使用 *)该对象。

我想你可以算出最后一个例子:

ExampleClass& doSomething(ExampleClass& ec) {}

请注意,在返回引用时,您必须确保被引用的对象在函数上下文之外分配了空间(例如,作为全局变量或静态局部变量),以便它不会被破坏。

您不应返回对局部变量的引用,该引用将在函数退出时被销毁,例如:

ExampleClass& doSomething(ExampleClass* ec) {
  ExampleClass copy = *ec;
  return copy; // WARNING: returning reference to object that will be destroyed
}
于 2012-09-06T08:21:33.150 回答
0
ExampleClass* doSomething(ExampleClass* ec) {}

将指针作为参数,返回一个指针。

ExampleClass* doSomething(ExampleClass& ec) {}

通过引用获取一个对象并返回一个指针。

ExampleClass& doSomething(ExampleClass* ec) {}

将指针作为参数并返回引用。

ExampleClass& doSomething(ExampleClass& ec) {}

通过引用获取一个对象并返回一个引用。

请注意,通过引用返回很棘手,因为它很容易导致未定义的行为。通过引用返回本地对象是非法的:

ExampleClass& doSomething() 
{
    ExampleClass x;
    return x;
}

这将编译(您可能会收到警告)但x在函数结束后被销毁,因此您将留下无效的引用。为了使其有效,x需要在函数结束后仍然存在(如果它是类成员,直到对象本身被销毁,或者它可以是static本地的,或动态分配的)。

指针也会发生同样的情况,尽管它不太常见:

ExampleClass* doSomething() 
{
    ExampleClass x;
    return &x;
}
于 2012-09-06T08:20:08.100 回答
0

在 C++ 中传递指向对象的指针和通过引用传递对象之间没有真正的区别。然而,通过引用传递允许更简单的运算符重载语法,并消除了对大量 -> 无处不在的需要,应该是首选。

通过引用传递对象时,不希望方法能够更改对象是很常见的。这是通过将对象参数声明为 const 引用 (const myClass&) 来实现的。

于 2012-09-06T08:33:22.827 回答
0
ExampleClass* doSomething(ExampleClass* ec) {}

函数做一些事情来获取值和返回值

ExampleClass* doSomething(ExampleClass& ec) {}

函数做一些事情,在内存中获取对象地址并返回值

ExampleClass& doSomething(ExampleClass* ec) {}

函数做一些事情来获取价值并返回内存中对象的地址

ExampleClass& doSomething(ExampleClass& ec) {}

函数做一些事情,获取并返回内存中对象的对象地址

于 2012-09-06T10:21:16.130 回答