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

  1. //例3.21 使用对象作为函数参数
  2. #include<iostream>
  3. using namespace std;
  4. class A{
  5. public:
  6. A(int n)
  7. {
  8. t = n;
  9. }
  10. void set_i(int n)
  11. {
  12. t = n;
  13. }
  14. int get_i()
  15. {
  16. return t;
  17. }
  18. private:
  19. int t;
  20. };
  21. void sqrt_it(A obj2) //对象obj2作为函数sqrt_it的形参,接收传来的实参对象obj1
  22. {
  23. obj2.set_i(obj2.get_i()*obj2.get_i());
  24. cout<<"在函数sqrt_it内,形参对象的obj2的数据成员t的值为:"<<obj2.get_i();
  25. cout<<endl;
  26. }
  27. int main()
  28. {
  29. A obj1();
  30. cout<<"调用函数sqrt_it前,实参对象obj1的数据成员t的值为:"<<obj1.get_i();
  31. cout<<endl;
  32. sqrt_it(obj1); //调用函数sqrt_it,实参obj1传给形参obj2
  33. cout<<"调用函数sqrt_it后,实参对象obj1的数据成员t的值为:"<<obj1.get_i();
  34. cout<<endl;
  35. return ;
  36. }
  37. /*
  38. 程序运行结果如下:
  39. 调用函数sqrt_it前,实参对象obj1的数据成员t的值为:10
  40. 在函数sqrt_it内,形参对象obj2的数据成员t的值为:100
  41. 调用函数sqrt_it后,实参对象obj1的数据成员t的值为:10
  42. */

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

  1. //例3.22 使用对象指针作为函数参数
  2. #include<iostream>
  3. using namespace std;
  4. class A{
  5. public:
  6. A(int n)
  7. {
  8. t = n;
  9. }
  10. void set_i(int n)
  11. {
  12. t = n;
  13. }
  14. int get_i()
  15. {
  16. return t;
  17. }
  18. private:
  19. int t;
  20. };
  21. void sqrt_it(A *obj2) //对象指针obj2作为函数sqrt_it的形参,接收传来的实参对象obj1地址
  22. { //也即指针obj2指向存放在obj1的地址内的值
  23. obj2->set_i(obj2->get_i()*obj2->get_i());
  24. //(*obj2).set_i((*obj2).get_i()*(*obj2).get_i());
  25. cout<<"在函数sqrt_it内,形参对象的obj2的数据成员t的值为:"<<obj2->get_i();
  26. cout<<endl;
  27. }
  28. int main()
  29. {
  30. A obj1();
  31. cout<<"调用函数sqrt_it前,实参对象obj1的数据成员t的值为:"<<obj1.get_i();
  32. cout<<endl;
  33. sqrt_it(&obj1); //调用函数sqrt_it,将实参对象obj1的地址传给形参指针变量obj2
  34. cout<<"调用函数sqrt_it后,实参对象obj1的数据成员t的值为:"<<obj1.get_i();
  35. cout<<endl;
  36. return ;
  37. }
  38. /*
  39. 程序运行结果如下:
  40. 调用函数sqrt_it前,实参对象obj1的数据成员t的值为:10
  41. 在函数sqrt_it内,形参对象的obj2的数据成员t的值为:100
  42. 调用函数sqrt_it后,实参对象obj1的数据成员t的值为:100
  43. */

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

  1. //例3.23 使用对象引用作为函数的参数
  2. #include<iostream>
  3. using namespace std;
  4. class A{
  5. public:
  6. A(int n)
  7. {
  8. t = n;
  9. }
  10. void set_i(int n)
  11. {
  12. t = n;
  13. }
  14. int get_i()
  15. {
  16. return t;
  17. }
  18. private:
  19. int t;
  20. };
  21. void sqrt_it(A &obj2) //对象obj2作为函数sqrt_it的形参,用obj2引用对象obj1
  22. {
  23. obj2.set_i(obj2.get_i()*obj2.get_i());
  24. cout<<"在函数sqrt_it内,形参对象的obj2的数据成员t的值为:"<<obj2.get_i();
  25. cout<<endl;
  26. }
  27. int main()
  28. {
  29. A obj1();
  30. cout<<"调用函数sqrt_it前,实参对象obj1的数据成员t的值为:"<<obj1.get_i();
  31. cout<<endl;
  32. sqrt_it(obj1); //调用函数sqrt_it,实参obj1传给形参obj2
  33. cout<<"调用函数sqrt_it后,实参对象obj1的数据成员t的值为:"<<obj1.get_i();
  34. cout<<endl;
  35. return ;
  36. }
  37. /*
  38. 程序运行结果如下:
  39. 调用函数sqrt_it前,实参对象obj1的数据成员t的值为:10
  40. 在函数sqrt_it内,形参对象的obj2的数据成员t的值为:100
  41. 调用函数sqrt_it后,实参对象obj1的数据成员t的值为:100
  42. */

总结:

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

C++:向函数传递对象(对象、对象指针、对象引用)的更多相关文章

  1. String类型函数传递问题

    String类型函数传递问题 问题 以前没有注意过的一个问题, 最近在使用String类型作为函数入参的时候, 发现函数内对于String类型的改变并不会影响到外层调用对象本身; 结论 (先说结论) ...

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

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

  3. 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用

    [源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象,  const 指针和指向 const 对象的指针, con ...

  4. JavaScript学习09 函数本质及Function对象深入探索

    JavaScript学习09 函数本质及Function对象深入探索 在JavaScript中,函数function就是对象. JS中没有方法重载 在JavaScript中,没有方法(函数)重载的概念 ...

  5. 使用自定义setTimeout和setInterval使之可以传递参数和对象参数

    转载自http://www.jb51.net/article/17859.htm /****************************************************** //  ...

  6. 修改 window.setTimeout,使之可以传递参数和对象参数

    /* 功能:修改 window.setTimeout,使之可以传递参数和对象参数 使用方法: setTimeout(回调函数,时间,参数1,,参数n) */ var _setTimeout=setTi ...

  7. C++@类对象和类指针的区别(转)

    原文地址不详 如下程序: #include <iostream> #include <string> using namespace std; class Student { ...

  8. JavaScript基础精华02(函数声明,arguments对象,匿名函数,JS面向对象基础)

    函数声明 JavaScript中声明函数的方式:(无需声明返回值类型) function add(i1, i2) {             return i1 + i2;//如果不写return返回 ...

  9. c++中多态性、dynamic_cast、父类指针、父类对象、子类指针、子类对象

    c++多态性是依靠虚函数和父类指针指向子类对象来实现的.简单来说,父类中定义虚函数,父类指针指向子类对象,父类指针调用函数时调用的就是子类的函数. 父类没有定义虚函数,父类指针指向子类对象时,父类指针 ...

随机推荐

  1. Jquery插件收集

    移动端滚动条插件iScroll.js http://www.cnblogs.com/starof/p/5215845.html http://www.codeceo.com/article/35-jq ...

  2. php开发过程中用什么方法来加快页面的加载速度

    1,数据库优化;2,php缓存;3,使用zend引擎(其它框架);4,分布式部署;5,静态

  3. 主成分分析(principal components analysis, PCA)——无监督学习

    降维的两种方式: (1)特征选择(feature selection),通过变量选择来缩减维数. (2)特征提取(feature extraction),通过线性或非线性变换(投影)来生成缩减集(复合 ...

  4. 典型的js页面

    var myurl; var mydata; var postype = "POST"; var getype = "GET"; var jsontype = ...

  5. Codeforces Round #238 (Div. 2) D. Toy Sum 暴搜

    题目链接: 题目 D. Toy Sum time limit per test:1 second memory limit per test:256 megabytes 问题描述 Little Chr ...

  6. BZOJ 3436: 小K的农场 差分约束

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=3436 题解: 裸的差分约束: 1.a>=b+c  ->  b<=a-c ...

  7. MemSQL Start[c]UP 2.0 - Round 1

    A. Eevee http://codeforces.com/contest/452/problem/A 字符串水题 #include<cstdio> #include<cstrin ...

  8. DIV+CSS 基础

    盒子模型:margin(边界),可被占位:border(边框):padding(填充):content(内容) 块元素: 默认占据一行,前后换行. 作为容器,装载块元素和行内元素,被装载元素的位置,会 ...

  9. MVC4 错误: 检测到有潜在危险的 Request.Form值

    说明: 请求验证过程检测到有潜在危险的客户端输入值,对请求的处理已经中止.该值可能指示存在危及应用程序安全的尝试,如跨站点脚本攻击.若要允许页面重写应用程序请求验证设置,请将 httpRuntime  ...

  10. uva 12086 树状数组

    树状数组 #include <cstdio> #include <cstdlib> #include <cmath> #include <map> #i ...