博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++引用(3) - 使用引用或者指针传递参数
阅读量:4071 次
发布时间:2019-05-25

本文共 2087 字,大约阅读时间需要 6 分钟。

C++中, 在下面的这几种情况下,一般使用引用来传递参数。
 
1)在被调函数中修改主调函数中的局部变量
例如,下面例子中函数fun()可以修改main()中的局部变量x.
#include 
void fun(int &x) { x = 20;}int main() { int x = 10; fun(x); std::cout<<"New value of x is "<
输出:
New value of x is 20
2)传递很大的对象
如果一个参数很大,则使用引用或者指针来传递参数会高效很多,因为传递的仅是一个地址,而不是整个对象。
例如,下面代码中的类Student和printStuDetails()函数.
class Student{private:    string name;    string score;};void printStuDetails(Student stu) {     cout<
上述代码主要的问题是: 每次调用函数printStuDetails(), 都会构造一个新的Student对象,其中包括数据成员的拷贝。更好的方法是使用引用.
 
void printStuDetails(const Student &stu) {     cout<

引用主要用于结构体或者类对象的传递,如果是基本类型int, char等,则引用没有什么优势。

3)避免对象分割
如果传递给函数的实参为子类对象,而形参是父类对象,则如果是按值传递,那么这个对象会被分割。
例如下面程序所示:

#include 
#include
class Car {public: virtual string getDescription() const { return "This is Car class"; }}; class SUV : public Car {public: virtual string getDescription() const { return "This is SUV class"; }}; void describe(Car car) { //此处会分割子类对象 std::cout<
<

输出:

This is Car Class

如果是按引用传递,则可以正确的输出 “This is SUV Class”. 见下面修改之后的程序.

#include 
#include
class Car {public: virtual string getDescription() const { return "This is Car class"; }}; class SUV : public Car {public: virtual string getDescription() const { return "This is SUV class"; }}; void describe(const Car &car) { // 这里不会切割子类对象 std::cout<
<
输出:
This is SUV Class
此条规则,与规则2相同, 对基本类型int, char等是不适用的。
 

4)在函数中实现运行时的多态

可以使用引用或指针传递参数,来实现函数的多态。例如,下面程序中,print()接收一个基类对象的引用,print函数会调用基类的show()函数,如果传递进来的采纳数是基类对象;如果传递的是子类对象,则会调用子类的show()函数。

#include
using namespace std; class base {public: virtual void show() { //注意这里的virtual关键字 cout<<"In base \n"; }}; class derived: public base {public: void show() { cout<<"In derived \n"; }}; //因为传递是的基类base的引用,所以这里可以实现运行时的多态void print(base &b) { b.show();} int main(void) { base b; derived d; print(b); print(d); return 0;}

输出:

In base
In derived

通常如果是上述的例子2或者3的情形下,推荐使用const引用来进行参数传递。这是为了预防对参数进行了意外修改。

转载地址:http://lmeji.baihongyu.com/

你可能感兴趣的文章
从mysql中 导出/导入表及数据
查看>>
HQL语句大全(转)
查看>>
几个常用的Javascript字符串处理函数 spilt(),join(),substring()和indexof()
查看>>
javascript传参字符串 与引号的嵌套调用
查看>>
swiper插件的的使用
查看>>
layui插件的使用
查看>>
JS牛客网编译环境的使用
查看>>
9、VUE面经
查看>>
Golang 数据可视化利器 go-echarts ,实际使用
查看>>
mysql 跨机器查询,使用dblink
查看>>
mysql5.6.34 升级到mysql5.7.32
查看>>
dba 常用查询
查看>>
Oracle 异机恢复
查看>>
Oracle 12C DG 搭建(RAC-RAC/RAC-单机)
查看>>
Truncate 表之恢复
查看>>
Oracle DG failover 后恢复
查看>>
mysql 主从同步配置
查看>>
为什么很多程序员都选择跳槽?
查看>>
mongdb介绍
查看>>
mongdb在java中的应用
查看>>