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

总结:

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

程序猿神奇的手,每时每刻,这双手都在改变着世界的交互方式!
本文转自当天真遇到现实博客园博客,原文链接:http://www.cnblogs.com/XYQ-208910/p/4912179.html ,如需转载请自行联系原作者
相关文章
|
4天前
|
C++ 数据格式
LabVIEW传递接收C/C++DLL指针
LabVIEW传递接收C/C++DLL指针
12 1
|
1天前
|
C++ 编译器 程序员
C++ 从零基础到入门(3)—— 函数基础知识
C++ 从零基础到入门(3)—— 函数基础知识
|
3天前
|
C++ 编译器
|
5天前
|
存储 安全 程序员
C++:智能指针
C++:智能指针
19 5
|
6天前
|
自然语言处理 编译器 C语言
【C++】C++ 入门 — 命名空间,输入输出,函数新特性
本文章是我对C++学习的开始,很荣幸与大家一同进步。 首先我先介绍一下C++,C++是上个世纪为了解决软件危机所创立 的一项面向对象的编程语言(OOP思想)。
32 1
【C++】C++ 入门 — 命名空间,输入输出,函数新特性
|
6天前
|
存储 安全 C++
深入理解C++中的指针与引用
深入理解C++中的指针与引用
9 0
|
6天前
|
Java C++ Python
【C++从练气到飞升】06---重识类和对象(二)
【C++从练气到飞升】06---重识类和对象(二)
|
6天前
|
编译器 C++
【C++从练气到飞升】06---重识类和对象(一)
【C++从练气到飞升】06---重识类和对象(一)
|
6天前
|
存储 编译器 C语言
【C++从练气到飞升】02---初识类与对象
【C++从练气到飞升】02---初识类与对象
|
7天前
|
算法 C++
【C++入门到精通】智能指针 shared_ptr循环引用 | weak_ptr 简介及C++模拟实现 [ C++入门 ]
【C++入门到精通】智能指针 shared_ptr循环引用 | weak_ptr 简介及C++模拟实现 [ C++入门 ]
10 0