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. C++中指向对象的常指针和指向常对象的指针

    指向对象的常指针 将指向对象的指针变量声明为const型,并使之初始化,这样指针值始终保持为其初始值,不能改变. Time t1(10,12,15),t2; Time * const ptr1=&am ...

随机推荐

  1. 编译osgEarth2.8遇到gdal_vrt.h找不到的问题

    在编译plugins osgearth_gdal的ReaderWriterGDAL.cpp的时候可能会遇到这个问题 gdal_vrt.h这个头文件在gdal-1.11.0\frmts\vrt目录下,从 ...

  2. Spring scope

    scope用来声明IOC容器中的对象应该处的限定场景或者说该对象的存活空间,即在IOC容器在 对象进入相应的scope之前,生成并装配这些对象,在该对象不再处于这些scope的限定之后,容器通常会销毁 ...

  3. BaseAdapter的getView()方法

    getView()是BaseAdapter的一个重要方法.为了研究getView()方法,使用了以下的类. // apk列表 class list_apk extends BaseAdapter{ p ...

  4. Codeforces Round #229 (Div. 2) C. Inna and Candy Boxes 树状数组s

    C. Inna and Candy Boxes   Inna loves sweets very much. She has n closed present boxes lines up in a ...

  5. usb口外接了Com设备,U盘识别不了问题

    就如本题,当我usb口外接了Com设备时候,再插入U盘会出现识别不了的问题. 解决方法非常的简单,只要拨出这个com设备的usb就可以使用U盘了^_^

  6. POJ1743---Musical Theme (后缀数组+二分)

    题意 :求最长不相交重复子串的长度.. 可以先求出LCP,,对于长度 二分出答案..(竟然不会写二分) #include <set> #include <map> #inclu ...

  7. TI芯片android环境搭建和编译

    1>. Reading package lists... Done Building dependency tree        Reading state information... Do ...

  8. Struts2 四、Struts2 处理流程

    1. 一个请求在Struts2框架中的处理步骤: a) 客户端初始化一个指向Servlet容器的请求: b) 根据Web.xml配置,请求首先经过ActionContextCleanUp过滤器,其为可 ...

  9. PHPCMS V9.3.2用户注册模板中的一个低级Bug

    当我们下载了目前最新的PHPCMS的时候,如果我们修改了用户注册的模板,那么模板缓存就会更新,这时候就会如下 的问题: Parse error: syntax error, unexpected T_ ...

  10. CentOs7 systemd添加自定义系统服务

    systemd: CentOS 7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,即:/usr/lib/systemd/syste ...