• 第18课 对象的构造(中)


    1. 带参数构造函数

    (1)构造函数可以根据需要定义参数

    (2)一个类中可以存在多个重载的构造函数

    (3)构造函数的重载遵循C++重载规则

    【友情提示】对象定义声明不同

      ①对象定义申请对象的内存空间并调用构造函数(如Test t;//定义并调用构造函数)

      ②对象声明告诉编译器己经存在一个对象并不调用构造函数(如extern Test t;)

          

    2. 构造函数的调用

    (1)一般情况下编译器根据给定的参数情况自动调用相应的构造函数

          

    【编程实验】带参数的构造函数  18-1.cpp

    #include <stdio.h>
    
     
    
    class Test
    
    {
    
    public:
    
       
    
        //不带参的构造函数
    
        Test()
    
        {
    
            printf("Test()
    ");
    
        }
    
       
    
        Test(int v)
    
        {
    
            printf("Test(int v), v = %d
    ", v);       
    
        }
    
    };
    
     
    
    int main()
    
    {
    
        Test t;      //调用Test();
    
        Test t1(1);  //调用Test(int v);
    
        Test t2 = 2; //调用Test(int v);
    
     
    
        int i(100);
    
        printf("i = %d
    ", i);
    
     
    
        return 0;
    
    }

    运行结果:

      

    (2)一些特殊情况下需要手工调用构造函数

    【编程实验】构造函数的手动调用  18-2.cpp

    #include <stdio.h>
    
    class Test
    {
    private:
        int m_value;
    
    public:
        
        //不带参的构造函数
        Test()
        {
            m_value = 0;
    
            printf("Test()
    ");
        }
        
        Test(int v)
        {
            m_value = v;
            printf("Test(int v), v = %d
    ", v);        
        }
    
        int getValue(){return m_value;}
    };
    
    int main()
    {
        //Test ta[3] = {1, 2, 3};//编译器自动调用带参构造函数
    
        //定义数组对象,并手动调用带参构造函数来初始化各个对象
        Test ta[3] ={Test(), Test(1), Test(2)};
        for(int i = 0;i< 3;i++)
        {
            printf("ta[%d].getValue() = %d
    ", i, ta[i].getValue());
        }
    
        Test t = Test(100); //定义并手动调用构造函数来初始化对象
    
        return 0;
    }

    运行结果:

      

     

    3. 小实例:开发一个数组类解决原生数组的安全性问题(需求)

    (1)提供函数获取数组的长度

    (2)提供函数获取数组的元素

    (3)提供函数设置数组元素

    【编程实验】数组类的实现  IntArray

    //IntArray.h

    #ifndef _INTARRAY_H_
    
    #define _INTARRAY_H_
    
     
    
    class IntArray
    
    {
    
    private:
    
        int m_length;
    
        int* m_pointer;
    
     
    
    public:
    
        IntArray(int len);
    
        ~IntArray();
    
     
    
        int length();
    
        bool get(int index, int& value);
    
        bool set(int index, int value);
    
    };
    
     
    
    #endif

    //IntArray.cpp

    #include "IntArray.h"
    
     
    
    IntArray::IntArray(int len)
    
    {
    
        m_pointer = new int[len];
    
     
    
        for(int i = 0; i<len; i++)
    
        {
    
            m_pointer[i] = 0;
    
        }
    
     
    
        m_length = len;
    
    }
    
     
    
    IntArray::~IntArray()
    
    {
    
        if(m_pointer)
    
        {
    
            delete[] m_pointer;
    
        }
    
    }
    
     
    
    int IntArray::length()
    
    {
    
        return m_length;
    
    }
    
     
    
    bool IntArray::get(int index, int& value)
    
    {
    
       bool bRet = (0 <= index) && (index <m_length);
    
     
    
       if(bRet)
    
       {
    
            value = m_pointer[index];
    
       }
    
     
    
       return bRet;
    
    }
    
     
    
    bool IntArray::set(int index, int value)
    
    {
    
     
    
       bool bRet = (0 <= index) && (index <m_length);
    
     
    
       if(bRet)
    
       {
    
            m_pointer[index] = value;
    
       }
    
     
    
       return bRet;
    
    }

    //main.cpp

    #include <stdio.h>
    
    #include "IntArray.h"
    
     
    
    int main()
    
    {
    
        IntArray a(5);//利用IntArray创建5个元素的数组对象
    
       
    
        for(int i=0; i<a.length();i++)
    
        {
    
            a.set(i, i + 1);
    
        }
    
     
    
        for(int i=0; i<a.length(); i++)
    
        {
    
            int value = 0;
    
           
    
            if(a.get(i, value))
    
            {
    
                printf("a[%d] = %d
    ", i, value);
    
            }
    
        }
    
     
    
        return 0;
    
    }

    运行结果:

      

    4. 小结

    (1)构造函数可以根据需要定义参数

    (2)构造函数之间可以存在重载关系

    (3)构造函数遵循C++重载函数的规则

    (4)对象定义(注意,不是声明触发构造函数的调用(自动调用构造函数)

    (5)在一些情况下可以手动调用构造函数(手动调用构造函数)

  • 相关阅读:
    迭代器模式
    命令模式
    模板方法
    springmvc执行原理及自定义mvc框架
    代理模式
    外观模式
    组合模式
    装饰器模式
    02——Solr学习之Solr安装与配置(linux上的安装)
    01——Solr学习之全文检索服务系统的基础认识
  • 原文地址:https://www.cnblogs.com/hoiday/p/10091379.html
Copyright © 2020-2023  润新知