来自Java,学习C++ - 理解函数的指针

Coming from Java, learning C++ - understanding pointers at functions

本文关键字:函数 指针 Java 学习 C++ 来自      更新时间:2023-10-16

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

有什么区别...

ExampleClass* doSomething(ExampleClass* ec) {}

ExampleClass* doSomething(ExampleClass& ec) {}

ExampleClass& doSomething(ExampleClass* ec) {}

ExampleClass& doSomething(ExampleClass& ec) {}

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

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

第一个示例采用指向 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);

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

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

ExampleClass& doSomething(ExampleClass& ec) {}

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

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

ExampleClass& doSomething(ExampleClass* ec) {
  ExampleClass copy = *ec;
  return copy; // WARNING: returning reference to object that will be destroyed
}
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;
}

在C++中传递指向对象的指针和通过引用传递对象之间没有真正的区别。但是,通过引用传递允许更简单的运算符重载语法,并且无需到处使用大量 ->,因此应首选。

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

ExampleClass* doSomething(ExampleClass* ec) {}

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

ExampleClass* doSomething(ExampleClass& ec) {}

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

ExampleClass& doSomething(ExampleClass* ec) {}

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

ExampleClass& doSomething(ExampleClass& ec) {}

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