zoukankan      html  css  js  c++  java
  • 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、使用对象引用作为函数的参数,所谓"对象引用",就是对实参对象换了个别名,实际上它们
    仍是同一个对象,所以,所谓的形参(别名对象)值的的改变,直接就是实参对象值的改变。

  • 相关阅读:
    win7系统宽带自动断开怎么解决【系统天地】
    Win10系统修复受损文件教程【系统天地】
    win10如何加快开机速度【系统天地】
    Netty核心概念(5)之Channel
    Netty核心概念(4)之Bootstrap
    漫谈NIO(3)之Netty实现
    漫谈NIO(2)之Java的NIO
    漫谈NIO(1)之计算机IO实现
    机器学习实战(二)决策树
    机器学习实战(一)k-近邻算法
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/4912179.html
Copyright © 2011-2022 走看看