C++:向函数传递对象(对象、对象指针、对象引用)
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++:向函数传递对象(对象、对象指针、对象引用)的更多相关文章
- String类型函数传递问题
String类型函数传递问题 问题 以前没有注意过的一个问题, 最近在使用String类型作为函数入参的时候, 发现函数内对于String类型的改变并不会影响到外层调用对象本身; 结论 (先说结论) ...
- C++_向函数传递对象
向函数传递对象 1. 使用对象作为函数参数 对象可以作为参数传递给函数,其方法与传递其他类型的数据相同. 在向函数传递对象时,是通过传值调用传递给函数的. 因此,函数中对对象的任何修改均不影响调用该函 ...
- 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, const 对象的引用
[源码下载] 不可或缺 Windows Native (18) - C++: this 指针, 对象数组, 对象和指针, const 对象, const 指针和指向 const 对象的指针, con ...
- JavaScript学习09 函数本质及Function对象深入探索
JavaScript学习09 函数本质及Function对象深入探索 在JavaScript中,函数function就是对象. JS中没有方法重载 在JavaScript中,没有方法(函数)重载的概念 ...
- 使用自定义setTimeout和setInterval使之可以传递参数和对象参数
转载自http://www.jb51.net/article/17859.htm /****************************************************** // ...
- 修改 window.setTimeout,使之可以传递参数和对象参数
/* 功能:修改 window.setTimeout,使之可以传递参数和对象参数 使用方法: setTimeout(回调函数,时间,参数1,,参数n) */ var _setTimeout=setTi ...
- C++@类对象和类指针的区别(转)
原文地址不详 如下程序: #include <iostream> #include <string> using namespace std; class Student { ...
- JavaScript基础精华02(函数声明,arguments对象,匿名函数,JS面向对象基础)
函数声明 JavaScript中声明函数的方式:(无需声明返回值类型) function add(i1, i2) { return i1 + i2;//如果不写return返回 ...
- c++中多态性、dynamic_cast、父类指针、父类对象、子类指针、子类对象
c++多态性是依靠虚函数和父类指针指向子类对象来实现的.简单来说,父类中定义虚函数,父类指针指向子类对象,父类指针调用函数时调用的就是子类的函数. 父类没有定义虚函数,父类指针指向子类对象时,父类指针 ...
随机推荐
- as 和is的区别
is 1,检查对象的兼容性,并返回true或false 2,不会抛出异常 3,null永远返回false as 1,检查对象的兼容性,并返回 true或false 2,不会抛出异常 3,null将抛出 ...
- Selenium 入门
我本身也是一个初学者,就顺手记录一下自己的成长记录,共勉 1, 登录selenium官方网站,download 相关的插件. http://docs.seleniumhq.org/ 我用的是eclip ...
- Struts 2简单配置分析
要配置Struts 2,首先先要有Struts 2的Jar包,可以去Struts的官网下载(http://struts.apache.org/),这里有3个GA版本可以选择下载,我选择的是最新的2.2 ...
- floor舍去法取整
$int = 0.99999999999999999; echo floor($int); // returns 1 $int = 0.9999999999999999; echo floor($in ...
- ubuntu14.04 安装matlab r2013a
神奇的linux. 进入主题:matlab相信是不少工程人员缺少不了的工具,就我所在的通信行业更是如此,matlab的linux版本是和windows版本同步更新, 不过r2012之后只提供64位版本 ...
- LoadRunner 学习笔记(2)VuGen运行时设置Run-Time Setting
定义:在Vugen中Run-Time Setting是用来设置脚本运行时所需要的相关选项
- 11.1Daily Scrum
人员 任务分配完成情况 明天任务分配 王皓南 主网页的框架搭建,任务编号760 研究代码,学习相应语言,讨论设计思路 申开亮 学习数据库的操作,任务编号761 研究代码,学习相应语言,讨论设计思路 王 ...
- 修复jquery.treeview的增加子节点的方法的bug
1.修复理由 在一个android项目中用到了treeview控件(本来自己通过android的原生api实现了一个http://www.cnblogs.com/Mr-Nobody/p/3527688 ...
- 用protobuf编译时报错:protoc: error while loading shared libraries: libprotoc.so.9: cannot open shared object file: No such file or directory 的解决方法
解决办法:export LD_LIBRARY_PATH=/usr/local/lib
- 【BZOJ】【3759】Hungergame饥饿游戏
博弈论/高斯消元 如果没有打开箱子这个操作,那么就是一个很裸的Nim游戏…… 但是有了打开箱子这个操作,就变得蛋疼了T_T 首先我们可以想到一种直接的做法:打开所有箱子,当然如果此时所有a[i]的xo ...