C++中的函数参数(实参,指针,引用)

举个例子,有这么一个结构体:

struct Demo 
{
  char name[10000];
  int  count;
};

int main()
{
  Demo my_demo = {0};
  Demo *my_demo_p = &my_demo;
  Demo &my_demo_ref = my_demo;
  
  // 方式1:传递实参  
  func1(my_demo);

  // 方式2:传递指针  
  func2(my_demo_p);

  // 方式3:传递引用  
  func3(my_demo_ref);

  return 0;
}
如上所示,参数传递可以有三种方式,则三种函数可以这样定义:

// 方式1:传递实参 
void func1(Demo demo)
{
  cout << demo.name;
}

// 方式2:传递指针  
void func2(const Demo *demo_p)
{
  cout << demo->name;
}

// 方式3:传递引用  
void func3(const Demo &demo_ref)
{
  cout << demo.name;
}

可以看出,引用和实参的使用方式很像,但注意以下几点:

  1. 从内存使用的角度来说,传递实参,则会将数据拷贝过去(创建了副本),即 func1 对传入的数据做任何修改,都不会影响 my_demo。

  2. 既然传递实参要创建副本,就意味着效率更低。例子中结构体的 name 成员长度为 10000,就是要突出这个效率问题。
    引用和指针也很像,它们都不会创建副本,因此效率都很高。它们的主要区别在于:

  3. 选择成员的时候,引用使用点 . 来查找,而指针则使用 -> 来查找。

  4. 指针可能传递一个 NULL 过来,因此在使用前必须检查有效性;引用则必然代表某个对象,不需要做此检查。

PS: 在代码中加上 const 关键字的目的,是不希望 func2 和 func3 去修改原始数据,因为函数仅仅是为了打印出 name。

搬运自:菜鸟教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值