3.5.1   使用对象作为函数参数,其方法与传递基本类型的变量相同

//例3.21 使用对象作为函数参数
#include<iostream>
using namespace std;
class A{public:A(int n){t = n;}void set_i(int n){t = n;}int get_i(){return t;}private:int t;
};
void sqrt_it(A obj2)  //对象obj2作为函数sqrt_it的形参,接收传来的实参对象obj1
{obj2.set_i(obj2.get_i()*obj2.get_i());cout<<"在函数sqrt_it内,形参对象的obj2的数据成员t的值为:"<<obj2.get_i();cout<<endl;
}
int main()
{A obj1(10);cout<<"调用函数sqrt_it前,实参对象obj1的数据成员t的值为:"<<obj1.get_i();cout<<endl;sqrt_it(obj1);  //调用函数sqrt_it,实参obj1传给形参obj2 cout<<"调用函数sqrt_it后,实参对象obj1的数据成员t的值为:"<<obj1.get_i();cout<<endl;return 0;
}
/*
程序运行结果如下:调用函数sqrt_it前,实参对象obj1的数据成员t的值为:10在函数sqrt_it内,形参对象obj2的数据成员t的值为:100调用函数sqrt_it后,实参对象obj1的数据成员t的值为:10
*/ 

3.5.2  使用对象指针作为函数参数,可以实现"传址调用"

//例3.22  使用对象指针作为函数参数
#include<iostream>
using namespace std;
class A{public:A(int n){t = n;}void set_i(int n){t = n;}int get_i(){return t;}private:int t;
};
void sqrt_it(A *obj2)  //对象指针obj2作为函数sqrt_it的形参,接收传来的实参对象obj1地址
{                      //也即指针obj2指向存放在obj1的地址内的值 obj2->set_i(obj2->get_i()*obj2->get_i());//(*obj2).set_i((*obj2).get_i()*(*obj2).get_i());cout<<"在函数sqrt_it内,形参对象的obj2的数据成员t的值为:"<<obj2->get_i();cout<<endl;
}
int main()
{A obj1(10);cout<<"调用函数sqrt_it前,实参对象obj1的数据成员t的值为:"<<obj1.get_i();cout<<endl;sqrt_it(&obj1); //调用函数sqrt_it,将实参对象obj1的地址传给形参指针变量obj2cout<<"调用函数sqrt_it后,实参对象obj1的数据成员t的值为:"<<obj1.get_i();cout<<endl;return 0;
}
/*
程序运行结果如下:调用函数sqrt_it前,实参对象obj1的数据成员t的值为:10在函数sqrt_it内,形参对象的obj2的数据成员t的值为:100调用函数sqrt_it后,实参对象obj1的数据成员t的值为:100
*/ 

3.5.3  使用对象引用作为函数参数(兼具对象指针的优点,而且更简单、更直接)

//例3.23 使用对象引用作为函数的参数#include<iostream>
using namespace std;
class A{public:A(int n){t = n;}void set_i(int n){t = n;}int get_i(){return t;}private:int t;
};
void sqrt_it(A &obj2)  //对象obj2作为函数sqrt_it的形参,用obj2引用对象obj1
{obj2.set_i(obj2.get_i()*obj2.get_i());cout<<"在函数sqrt_it内,形参对象的obj2的数据成员t的值为:"<<obj2.get_i();cout<<endl;
}
int main()
{A obj1(10);cout<<"调用函数sqrt_it前,实参对象obj1的数据成员t的值为:"<<obj1.get_i();cout<<endl;sqrt_it(obj1);  //调用函数sqrt_it,实参obj1传给形参obj2 cout<<"调用函数sqrt_it后,实参对象obj1的数据成员t的值为:"<<obj1.get_i();cout<<endl;return 0;
}
/*
程序运行结果如下:调用函数sqrt_it前,实参对象obj1的数据成员t的值为:10在函数sqrt_it内,形参对象的obj2的数据成员t的值为:100调用函数sqrt_it后,实参对象obj1的数据成员t的值为:100
*/

总结:

1、使用对象作为函数参数,形参和实参是不同的对象,它们所占地址空间不同,因此,形参
的改变,并不影响实参的值。
2、使用对象指针作为函数参数中,所谓"传址调用",就是在函数调用时使实参对象和形参对象
的地址传递给函数,形参和实参都指向同一个地址值,此时在函数中对形参对象的修改将影
响调用该函数的实参对象本身。
3、使用对象引用作为函数的参数,所谓"对象引用",就是对实参对象换了个别名,实际上它们
仍是同一个对象,所以,所谓的形参(别名对象)值的的改变,直接就是实参对象值的改变。

C++:向函数传递对象(对象、对象指针、对象引用)相关推荐

  1. js中函数传递参数,究竟是值传递还是引用传递?

    记住真理: js函数传递参数,不管是简单数据类型,还是引用数据类型,都是值传递!! 下面是js红包书里面的例子: function setName(obj) { obj.name = "Ni ...

  2. C++ 笔记(18)— 类和对象(this 指针、指向类的指针、类静态成员变量和函数)

    1. this 指针 在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址. this 指针是所有成员函数的隐含参数.因此,在成员函数内部,它可以用来指向调用对象. 友元函数没有 thi ...

  3. C++_向函数传递对象

    向函数传递对象 1. 使用对象作为函数参数 对象可以作为参数传递给函数,其方法与传递其他类型的数据相同. 在向函数传递对象时,是通过传值调用传递给函数的. 因此,函数中对对象的任何修改均不影响调用该函 ...

  4. Go 学习笔记(34)— Go 方法声明、方法调用、方法值、方法表达式、切片对象方法、指针对象方法

    1. 方法声明 Go 语言的方法非常纯粹, 可以看作特殊类型的函数, 其显式地将对象实例或指针作为函数的第一个参数, 并且参数名可以自己指定, 而不强制要求一定是 this 或 self .这个对象实 ...

  5. (重要)java都是值传递,与对象形参所指向的对象改变,其实参所指向的对象也相应改变并不矛盾(2011年9.30日一天写的两个程序的总结结果)...

    1.0建立二叉树的代码,在java中必须创建二叉树的方法必须用返回值,因为不存在c语言中的引用传递,在java中只有值传递 代码1为正确,代码2(没有使用返回值)为错误.那么为什么之前的例子中将对象作 ...

  6. java中形参不可以是对象吗_(重要)java都是值传递,与对象形参所指向的对象改变,其实参所指向的对象也相应改变并不矛盾(2011年9.30日一天写的两个程序的总结结果)...

    1.0建立二叉树的代码,在java中必须创建二叉树的方法必须用返回值,因为不存在c语言中的引用传递,在java中只有值传递 代码1为正确,代码2(没有使用返回值)为错误.那么为什么之前的例子中将对象作 ...

  7. 22.类对象和类指针

    Student a; s.setName("A");//Studeng *b = new Student();Student *b;b = new Student();b-> ...

  8. 类对象和类指针深入分析与对比

    1.前言 Student a; s.setName("A");//Studeng *b = new Student(); Student *b; b = new Student() ...

  9. Py函数直接传入root是啥意思_阿里云python课程笔记(四):函数amp;类和对象

    接阿里云python课程笔记(三):数据结构 我们讨论一下python中的深拷贝和浅拷贝 dic1 = {'user': 'lsgogroup', 'num': [1, 2, 3]}# 引用对象dic ...

  10. 类和对象——对象特性——this指针的用途

    在C++中成员变量和成员函数是分开存储的.每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码. 那么问题是:这一块代码是如何区分是哪个对象调用自己的呢? C++通过提供特 ...

最新文章

  1. 隐马尔可夫模型 HMM 原理及实现
  2. 工作322:uni-扩展运算符实现拼接合并操作
  3. linux将一个文件的内容复制到另一个新的文件
  4. Android studio gradle 无法获取 pom文件
  5. Tensorflow 2.1 迁移学习 基于VGG
  6. extract提取返回结果中的内容_httprunner如何提取数据串联上下游接口
  7. 判断字符串是否是空格
  8. Linux命令解释之cp
  9. keras中TimeDistributed的用法
  10. Java编程工具之 word转pdf
  11. 【新书推荐】【2020】卫星通信(第三版)
  12. 云计算机平台搭建,搭建云计算平台的步骤
  13. 如何在oracle官网下载jdk11,在linux上使用wget从oracle官网下载jdk11
  14. Mac动态桌面壁纸Dynamic Wallpaper惊艳你的桌面
  15. MFC控件自适应调整大小
  16. 互联网金融涌动下的冲动与借债
  17. 山东农业大学考研计算机专业分数,山东农业大学研究生分数线
  18. python中response是什么意思_对python中各个response的使用说明
  19. 移动直播技术秒开优化经验(含PPT)
  20. 车载应用--AUXIN 利用 surfaceView 预览 Camera 数据

热门文章

  1. JavaWeb请求的重定向与转发:getRequestDispatcher()的forward方法,sendRedirect方法,以及重定向与转发的区别
  2. 爱情指数测试脸型软件,心理测试:你和谁的脸型最像?测出你的幸运指数是多少!...
  3. java 内省 反射_java 反射与内省
  4. 凸优化第七章统计估计 7.3最优检测器设计及假性检验
  5. 在Java中如何遍历Map对象
  6. sublime text 2/3 快捷键汇总
  7. servlet后端连接 微信小程序与_微信小程序授权登录
  8. 使用ppmap检测和利用XSS漏洞
  9. Tomcat8+redis实现session共享
  10. zoj 3599 Game 博弈论