指针和引用有相似之处。它们都指向或引用一个对象,而没有空间来表示对象本身的值。然而,指针显式地使用*
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
}