码迷,mamicode.com
首页 > 其他好文 > 详细

第18课 对象的构造(中)

时间:2016-04-12 23:51:13      阅读:399      评论:0      收藏:0      [点我收藏+]

标签:

1. 带参数的构造函数

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

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

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

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

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

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

2. 构造函数的调用

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

【编程实验】带参数的构造函数

#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)一些特殊情况下,需要手工调用构造函数

【编程实验】构造函数的手动调用

#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.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)在一些情况下可以手动调用构造函数

 

第18课 对象的构造(中)

标签:

原文地址:http://www.cnblogs.com/5iedu/p/5384920.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!