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();
       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;
       ;
}
/*
程序运行结果如下:
 调用函数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();
       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;
       ;
}
/*
程序运行结果如下:
 调用函数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();
       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;
       ;
}
/*
程序运行结果如下:
 调用函数sqrt_it前,实参对象obj1的数据成员t的值为:10
 在函数sqrt_it内,形参对象的obj2的数据成员t的值为:100
 调用函数sqrt_it后,实参对象obj1的数据成员t的值为:100
*/

总结:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. 函数中的 arguments 对象

    JavaScript函数具有像数组一样的对象,这些对象称为arguments,与传递给函数的参数相对应.传递给JavaScript函数的所有参数都可以使用arguments对象来引用. 现在我们开始学 ...

  9. 《zw版&#183;Halcon-delphi系列原创教程》 Halcon分类函数010,obj,对象管理

    <zw版·Halcon-delphi系列原创教程> Halcon分类函数010,obj,对象管理 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替换:“p ...

随机推荐

  1. nefu1109 游戏争霸赛(状压dp)

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...

  2. Sublime text3 常用插件 安装

    1 安装插件前的准备工作 首先确保你的Sublime Text3编辑器为官方版(非破解版),建议下载官网的便携版本(好处多多). 然后安装插件管理工具(Package Control) 1.1 打开S ...

  3. 深入理解JavaScript系列:JavaScript的构成

    此篇文章不是干货类型,也算不上概念阐述,就是简单的进行一个思路上的整理. 要了解一样东西或者完成一件事情,首要的就是先要搞清楚他是什么.作为一个前端开发人员,JavaScript应该算作是最核心之一的 ...

  4. 备库Seconds_Behind_Master的计算

    背景 在mysql主备环境下,主备同步过程如下,主库更新产生binlog, 备库io线程拉取主库binlog生成relay log.备库sql线程执行relay log从而保持和主库同步. 理论上主库 ...

  5. HttpRequestDeviceUtils

    import javax.servlet.http.HttpServletRequest;public class HttpRequestDeviceUtils { /**Wap网关Via头信息中特有 ...

  6. 熟悉 Objective-C

    ## 1. OC 的起源 OC 的方法(本质上讲是消息)在运行时决定.使用函数调用的语言,由编译器决定.如果涉及多态,则用到虚函数表. ## 2. 少在头文件中引用其他文件 1. 两个头文件互相引用会 ...

  7. 【笨嘴拙舌WINDOWS】实践检验之按键精灵【Delphi】

    通过记录键盘和鼠标位置和输入信息,然后模拟发送,就能够创建一个按键精灵! 主要代码如下: library KeyBoardHook; { Important note about DLL memory ...

  8. 小娱乐一下,fileInfo中的Name ,FullName的用法小BUG

    var filePath = new FileInfo(@"c:\text(sdf\123).txt"); Console.WriteLine(filePath.Name); Co ...

  9. SQL Server 执行计划操作符详解(2)——串联(Concatenation )

    本文接上文:SQL Server 执行计划操作符详解(1)--断言(Assert) 前言: 根据计划,本文开始讲述另外一个操作符串联(Concatenation),读者可以根据这个词(中英文均可)先幻 ...

  10. pytest自动化5:pytest-html插件--生成html报告

    前言:pytest-HTML是一个插件,pytest用于生成测试结果的HTML报告.兼容Python 2.7,3.6 pytest-html 1.  pip 安装: pip install pytes ...