gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:30:56 25 4
gpt4 key购买 nike

我已经阅读了针对想要学习 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);

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

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

ExampleClass& doSomething(ExampleClass& ec) {}

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

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

ExampleClass& doSomething(ExampleClass* ec) {
ExampleClass copy = *ec;
return copy; // WARNING: returning reference to object that will be destroyed
}

关于java - 来自Java,学习C++——理解函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12295709/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com