• 第18课


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

    1. 构造函数详解

      函数头的三大元素:int  func(para1, para2, ...) 返回值类型、函数名、参数。构造函数的返回值类型(无)、函数名(类名)都已确定,那参数能不能由程序员自定义呢?

    1.1 带有参数的构造函数

      (1)构造函数可以根据需要定义参数,这些参数用于对象的初始化     【意义:使每个对象具有不同的初始化状态】

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

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

    Tips:对象定义对象声明的不同

      (1)对象定义:申请对象的空间并调用构造函数

      (2)对象声明:告诉编译器存在这样一个对象

      

    1.2 构造函数的自动调用

      当创建对象时,构造函数会被自动调用。

     1 #include <stdio.h>
     2 
     3 class Test
     4 {
     5 public:
     6     Test() 
     7     { 
     8         printf("Test()
    ");
     9     }
    10 
    11     Test(int v) 
    12     { 
    13         printf("Test(int v), v = %d
    ", v);
    14     }
    15 };
    16 
    17 int main()
    18 {
    19     Test t;      // 调用 Test()
    20     Test t1(1);  // 调用 Test(int v)
    21     Test t2 = 2; // 调用 Test(int v)
    22 
    23     int i(100); 
    24 
    25     printf("i = %d
    ", i);
    26 
    27     return 0;
    28 
    29 }
    带参数的构造函数

    1.3 构造函数的手动调用

      (1)一般情况下,构造函数在对象定义时自动被调用

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

      思考:如何创建一个对象数组?  【希望在创建对象数组后,对每个对象进行不同的初始化,就需要手工调用构造函数】

     1 #include <stdio.h>
     2 
     3 class Test
     4 {
     5 private:
     6     int m_value;
     7 public:
     8     Test()
     9     {
    10         printf("Test()
    ");
    11         
    12         m_value = 0;    
    13     }
    14     Test(int val)
    15     {
    16         printf("Test(int val), val = %d
    ", val);
    17         
    18         m_value = val;
    19     }
    20     
    21     int getValue() { return m_value; }
    22 };
    23 
    24 int main(void)
    25 {
    26     // Test ta[3];
    27     
    28     Test ta[3] = {Test(), Test(1), Test(2)};    
    29     
    30     for(int i=0; i<3; i++)
    31     {
    32         printf("ta[%d].getValue = %d
    ", i, ta[i].getValue());
    33     }
    34     
    35     Test t = Test(100);
    36 
    37         printf("t.getValue() = %d
    ", t.getValue());
    38     
    39     return 0;
    40 }
    构造函数的手动调用

    2. 小实例

      需求:开发一个数组类解决原生数组的安全性问题

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

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

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

     1 #ifndef _INTARRAY_
     2 #define _INTARRAY_
     3 
     4 class IntArray
     5 {
     6 private:
     7     int m_length;
     8     int *m_pointer;
     9 public:
    10     IntArray(int len);
    11     int length();
    12     bool get(int index, int& value);
    13     bool set(int index, int value);
    14     void free();
    15 };
    16 
    17 #endif
    IntArray.h
     1 #include "IntArray.h"
     2 
     3 IntArray::IntArray(int len)
     4 {
     5     m_pointer = new int[len];
     6 
     7     for(int i=0; i<len; i++)
     8     {
     9         m_pointer[i] = 0;
    10     }
    11     
    12     m_length = len;
    13 }
    14 
    15 int IntArray::length()
    16 {
    17     return m_length;
    18 }
    19 
    20 bool IntArray::get(int index, int& value)
    21 {
    22     bool ret = (0 <= index) && (index < length());
    23     
    24     if( ret )
    25     {
    26         value = m_pointer[index];
    27     }
    28     
    29     return ret;
    30 }
    31 
    32 bool IntArray::set(int index, int value)
    33 {
    34     bool ret = (0 <= index) && (index < length());
    35 
    36     if( ret )
    37     {
    38         m_pointer[index] = value;
    39     }
    40 
    41     return ret;
    42 
    43 }
    44 
    45 void IntArray::free()
    46 {
    47     delete[]m_pointer;
    48 }
    IntArray.cpp
     1 #include <stdio.h>
     2 #include "IntArray.h"
     3 
     4 int main(void)
     5 {
     6     IntArray a(5);    
     7 
     8     for(int i=0; i<a.length(); i++)
     9     {
    10         a.set(i, i + 1);
    11     }   
    12 
    13     for(int i=0; i<a.length(); i++)
    14     {
    15         int value = 0;
    16 
    17         if( a.get(i, value) )
    18         {
    19             printf("a[%d] = %d
    ", i, value);
    20         }
    21     }
    22     
    23     a.free();
    24    
    25     return 0;
    26 }
    27 
    28  
    main.cpp

    3. 小结

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

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

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

      (4)对象定义时会触发构造函数的调用

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

  • 相关阅读:
    软硬链接
    查看文件内容
    cp+mv
    cd+rm+pwd
    ls+tree
    绝对路径和相对路径
    Linux目录结构
    修改hostname
    java. util. concurrent. atomic
    git
  • 原文地址:https://www.cnblogs.com/shiwenjie/p/7228833.html
Copyright © 2020-2023  润新知