C++中,对象作为函数参数的几种情况

Passing Objects to Functions (对象作为函数参数)
  1. 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对象进行了解引用。

  1. Objects as Function Return Value(对象作为函数返回值)
// class Object { ... };
Object f ( /*函数形参*/ ){
  // Do something
  return Object(args);
}


// main() {
Object o = f ( /*实参*/ );

f( /*实参*/ ).memberFunction();

创建了一个函数对象o = f(args),可以调用函数对象的属性值。object类型的函数定义中返回该对象传入的参数。

  1. 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, /* 其它参数 */) { }
  1. 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 */) { }
  1. 一些高阶问题

传值,传址,传指针,传引用都是骗初学者的。C++中有意义的概念是传值和传引用。

Differences between a pointer variable and a reference variable
Difference between passing by reference vs. passing by value?

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值