Objects as Function Arguments
(对象作为函数参数)You can pass objects by value or by reference.
(对象作为函数参数,可以按值传递,也可以按引用传递)
(1) Objects as Function Return Value
(对象作为函数参数)
// Pass by value
void print( Circle c ) {
//作为函数参数
/* … */
}
int main() {
Circle myCircle(5.0);
print( myCircle ); //作为函数参数
/* … */
}
其中,先创建一个myCircle
对象,然后print
函数调用该对象。
(2) Objects Reference as Function Return Value
(对象引用作为函数参数)
void print( Circle& c ) {
/* … */
}
int main() {
Circle myCircle(5.0);
print( myCircle );
/* … */
}
虽然在调用print
函数时传入的参数是对象,但是在print
函数定义中,使用了引用类型。
(3) Objects Pointer as Function Return Value
(对象指针作为函数参数)
// Pass by pointer
void print( Circle* c ) {
/* … */
}
int main() {
Circle myCircle(5.0);
print( &myCircle );
/* … */
}
在调用print
函数时传入的参数是创建的对象的地址,在print
函数定义中,对myCircle
对象进行了解引用。
Objects as Function Return Value
(对象作为函数返回值)// class Object { ... };
Object f ( /*函数形参*/ ){
// Do something
return Object(args);
}
// main() {
Object o = f ( /*实参*/ );
f( /*实参*/ ).memberFunction();
创建了一个函数对象o
= f(args)
,可以调用函数对象的属性值。object
类型的函数定义中返回该对象传入的参数。
Objects Pointer as Function Return Value
(对象指针作为函数返回值)// class Object { ... };
Object* f ( /*函数形参*/ ){
Object* o = new Object(args) // 这是“邪恶”的用法,不要这样做
// Do something
return o;
}
// main() {
Object* o = f ( /*实参*/ );
f( /*实参*/ )->memberFunction();
// 记得要delete o
在该例子中,指针对象o
在被创建时的生命周期为f(args)
内部,调用完就会被擦除。
下面是允许的用法
// class Object { ... };
Object* f ( Object* p, /*其它形参*/ ){
// Do something
return p;
}
// main() {
Object* o = f ( /*实参*/ );
// 不应该delete o
操作的是传入的对象指针,因此调用完后仍然能够返回传入的对象指针。
尽可能用
const
修饰函数返回值类型和参数,除非你有特别的目的(使用移动语义等)。
const Object* f(const Object* p, /* 其它参数 */) {
}
Objects Reference as Function Return Value
(对象引用作为函数返回值)// class Object { ... };
Object& f ( /*函数形参*/ ){
Object o {
args};
// Do something
return o; //这是邪恶的用法
}
可行的用法1:
// class Object { ... };
class X {
Object o;
Object f( /*实参*/ ){
// Do something
return o;
}
}
o
的属性会被保留。
可行的用法2:
// class Object { ... };
Object& f ( Object& p, /*其它形参*/ ){
// Do something
return p;
}
// main() {
auto& o = f ( /*实参*/ );
f( /*实参*/ ).memberFunction();
和指针类似。
用
const
修饰引用类型的函数返回值,除非你有特别目的(比如使用移动语义)
const Object& f( /* args */) {
}
传值,传址,传指针,传引用都是骗初学者的。C++中有意义的概念是传值和传引用。
Differences between a pointer variable and a reference variable
Difference between passing by reference vs. passing by value?