第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()\n");

    }

   

    Test(int v)

    {

        printf("Test(int v), v = %d\n", v);       

    }

};

 

int main()

{

    Test t;      //调用Test();

    Test t1(1);  //调用Test(int v);

    Test t2 = 2; //调用Test(int v);

 

    int i(100);

    printf("i = %d\n", i);

 

    return 0;

}

运行结果:

  

 

 

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

 

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

#include <stdio.h>

class Test
{
private:
    int m_value;

public:
    
    //不带参的构造函数
    Test()
    {
        m_value = 0;

        printf("Test()\n");
    }
    
    Test(int v)
    {
        m_value = v;
        printf("Test(int v), v = %d\n", 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\n", 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\n", i, value);

        }

    }

 

    return 0;

}

运行结果:

  

 

4. 小结

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

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

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

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

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

 

posted @ 2018-12-09 15:26  梦心之魂  阅读(164)  评论(0编辑  收藏  举报