第18课 对象的构造(中)

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

时间: 2024-08-08 20:51:15

第18课 对象的构造(中)的相关文章

第19课 - 对象的构造(下)

第19课 - 对象的构造(下) 1. 特殊的构造函数 (1)无参构造函数 当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空. (2)拷贝构造函数 当类中没有定义拷贝构造函数时,编译器默认提供一个拷贝构造函数,简单的进行成员变量的值复制. 1 #include <stdio.h> 2 3 class Test 4 { 5 private: 6 int i; 7 int j; 8 public: 9 int getI() 10 { 11 return i; 12 } 13

第17课 - 对象的构造

第17课 - 对象的构造(上) 0. 问题 对象中成员变量的初始值是什么? 下面的类定义中成员变量 i 和 j 的初始值是什么?  对象定义在 全局空间.栈上.堆上,具有不同的属性. 1 #include <stdio.h> 2 3 class Test 4 { 5 private: 6 int i; 7 int j; 8 public: 9 int getI() { return i; } // 类成员函数,直接访问 10 int getJ() { return j; } 11 }; 12

第21课对象的构造顺序

对象的构造顺序一C++中的类可以定义多个对象,那么对象的构造顺序是怎样的呢?对于局部对象当程序执行流到达对象的定义语句时进行构造对象定义------>构造 原文地址:https://www.cnblogs.com/-glb/p/11846137.html

第21课 对象的构造顺序

1. 对象的构造顺序 (1)对于局部对象:当程序执行流到达对象的定义语句时进行构造 [实例分析]局部对象的构造顺序 (2)对于堆对象 ①当程序执行流到达new语句时创建对象 ②使用new创建对象将自动触发构造函数的调用 [编程实验]堆对象的构造顺序 (2)对于全局对象 ①对象的构造顺序是不确定的 ②不同的编译器使用不同的规则确定构造顺序 [实例分析]全局对象的构造顺序 2.小结 (1)局部对象的构造顺序依赖于程序的执行流 (2)堆对象的构造顺序依赖于new的使用顺序 (3)全局对象的构造顺序是不

第17课 对象的构造(上)

对象中的成员变量的初始值是多少? 小实验: 示例如下: 我们可以看到打印出来的i和j的值确实是随机值. 添加Test类的全局对象gt,再次运行结果如下: 可以看到gt对象中的i和j都为0. 第20行定义的t1在栈上,而13行的gt在全局存储区. 再次在堆空间创建一个变量,程序如下: 1 #include <stdio.h> 2 3 class Test 4 { 5 private: 6 int i; 7 int j; 8 public: 9 int getI() { return i; } 1

C++语言(03)——对象的构造

对象的构造(上) 成员变量的初始值 (1)从程序设计的角度来看,对象只是变量,定义对象就是定义变量,所以:在栈上创建对象时,成员变量初始值为随机值在堆上创建对象时,成员变量初始值为随机值在静态数据区上创建对象时,成员变量初始值为0(2)全局变量和static修饰的局部变量存储在静态数据区,没有显式初始化其值为0(bss/ZI段) /** 从程序设计的角度来看,对象只是变量,定义对象就是定义变量,所以: 在栈上创建对象时,成员变量初始值为随机值 在堆上创建对象时,成员变量初始值为随机值 在静态数据

C++---对象的构造

一.对象的构造(上) Q:对象中成员变量的初始值是多少? #include <iostream> using namespace std; class Test { private: int i; int j; public: int getI() { return i; } int getJ() { return j; } }; int main() { Test t1; cout<<"t1.getI()="<<t1.getI()<<e

第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据

第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据 ADO.NET 为什么要学习? 我们要搭建一个平台(Web/Winform)让用户方便的操作数据库中的数据. 什么是ADO.NET 是一组库类,System.Data. Ado.net组成 Connection:用来连接数据库 Command:用来执行SQL语句 DataReader:只读.只进的结果集,一条一条读取数据(SteamReader.XmlReader) Da

对象的构造(十四)

我们在 C 语言中,每个变量都有其初始值.那么问题来了,对象中成员变量的初始值是多少呢?从设计的角度来看,对象只是变量,因此:在栈上创建对象时,成员变量初始为随机值:在堆上创建对象时,成员变量初始为随机值:在静态存储区创建对象时,成员变量初识为 0 值. 下来我们以代码为例进行验证,代码如下 #include <stdio.h> class Test { private:     int i;     int j; public:     int getI() { return i; }