来自Java,学习C++ - 理解函数的指针
Coming from Java, learning C++ - understanding pointers at functions
我读过一个针对想要学习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) {}
函数做一些事情来获取和返回内存中对象的对象地址
- QMetaObject invokeMethod的基于函数指针的语法
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- c++r值引用应用于函数指针
- 模板函数指针和lambda
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 带有类的函数指针
- () 函子后面的括号,而不是函数指针?
- 全局作用域中函数指针的赋值
- 使用"Task"函数指针队列定义作业管理器
- 将成员函数指针作为参数传递给模板方法
- 如何创建对象函数指针C++映射?
- 匹配函数指针作为模板参数?
- 通过函数指针定义类范围之外的方法
- 存储在类中的函数指针
- C++从函数指针数组调用函数
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 整数键映射到头文件中的成员函数指针
- 从类成员函数到类 C 函数指针的转换
- 如何将内联匿名函数分配给C++函数指针
- 将字符缓冲区强制转换为函数指针