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

总结:

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获取GridView的数据行的数量

    一个同事在群里抛出了上述的问题,另一个同事给出了答案,试了一下,还不错.贴出代码和效果图: <html xmlns="http://www.w3.org/1999/xhtml" ...

  2. Oracle 动态视图2 V$LOCKED_OBJECT

    v$locked_object视图列出当前系统中哪些对象正被锁定 Column Datatype Description XIDUSN NUMBER 回滚段号 XIDSLOT NUMBER 槽号 XI ...

  3. innobackupex:Error:xtrabackup child process has died at /usr/bin/innobackupex

    使用innobackupex进行数据库备份,报如下错误:innobackupex --compress --parallel=4  --user=root  --password=yoon /expo ...

  4. nginx demo

    server_names_hash_bucket_size 512;upstream node_app { server 127.0.0.1:3000; } server { listen 80; s ...

  5. JDBC连接数据库代码

    //连接是需要导包 http://pan.baidu.com/s/1o6nyuOa /*配合数据库建立表 create database day14 character set utf8 collat ...

  6. iPhone OS 开发 - 了解并解决代码签名问题

    译者:Jestery 发表时间:2010-04-24浏览量:21082评论数:0挑错数:0 了解并解决代码签名问题 (为保持跟开发环境以及APPLE开发者社区网站结构对应,一些名词未作翻译) 绝大多数 ...

  7. SVN服务器搭建和使用

    SVN服务器搭建和使用 Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上了,下 ...

  8. WPF 多线程处理(3)

    WPF 多线程处理(1) WPF 多线程处理(2) WPF 多线程处理(3) WPF 多线程处理(4) WPF 多线程处理(5) WPF 多线程处理(6) 首先我们需要几个属性来保存取得的数据,因为在 ...

  9. 微信诡异的 40029 不合法的oauth_code

    最近几天在做微信公共平台开发,之前一切正常运行着,发布一套程序出去之后,发现时不时的报错! 小总结下问题出现原因:微信oauth2.0 接口说明 第一步:用户同意授权,获取code 在确保微信公众账号 ...

  10. ASP.Net MVC4 登录

    一月之前,工作室师兄给我们介绍博客,然后试着去申请了一个,一直不晓得更新什么,直到今天,才有了一点小想法.最近在做一个小网站,然后就在登录那一块犯愁了,止步不前. 以前对登录一直没有什么概念,以为登录 ...