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. SSL handshake failed: SSL 错误:在证书中检测到违规的密钥用法。

    问题:在WINDOWS中创建的SVN Server,在Linux client中无法连接.原因:WINDOWS中的证书无法被Linux正确识别,因此需要修改证书,以使双方都可以正确识别. 修改方法如下 ...

  2. jar 命令打war包

    假定有一个Web应用:C:\myHomemyHome/WEB-INF/……myHome/files/……myHome/image/……myHome/src/……myHome/index.jsp在命令行 ...

  3. MySQL监控工具-orztop

    先安装orzdba,链接:http://blog.itpub.net/28939273/viewspace-1875895/ 安装依赖的包:[root@hank-yoon servers]# yum ...

  4. VS2010性能监视工具

    <编程珠玑(续)>第一章中就介绍了性能监视工具,对于较简单的程序来说,性能监视工具其实可以用变量累加来计算的,但是对于较复杂的程序来说就需要比较好的性能监视工具了.而VS2010提供了一个 ...

  5. 【js】随机数

    <script>   function GetRandomNum(Min,Max){   var Range = Max - Min;   var Rand = Math.random() ...

  6. intellij 设置-试验过的

    1.已修改的文件星号“*”标记 2.在PROJECT窗口中快速定位,编辑窗口中的文件 在编辑的所选文件按ALT+F1, 然后选择PROJECT VIEW 3.改变编辑文本字体大小 FILE -> ...

  7. Cocos2D-x搭建新环境注意事项

    网上资源都说安装Python后, 设置环境变量, 解压Cocos2Dx压缩包就OK, 但运行CppTest还是会报错, 以下是错误解决方案: 1. 错误提示 error LNK1123: failur ...

  8. css文件都写在一个里面还是每个页面都引用单独的css样式好?

    因为网站比较小,外加网站页面有很多重复构件,决定采用“构件复用”搭建网页,但是遇到了一个问题.因为虽然有共同的css,但是每个页面或多或少都有独立的样式控制,到底是写在同一个css还是分离看上去清楚一 ...

  9. 阿里云CentOS6.3 安装MongoDB教程

    安装说明 系统环境:Centos-6.3安装软件:mongodb-linux-x86_64-2.2.2.tgz下载地址:http://www.mongodb.org/downloads安装机器:192 ...

  10. windows下创建.htaccess文件之讲解

    如果想在Windows操作系统下新增一个.htaccess 文件实现对页面的rewrite,任你如何右点鼠标或者选文件->新增去新增都不会成功的,Windows都会要求给个文件名称.如果你想通过 ...