zoukankan      html  css  js  c++  java
  • 第18课 对象的构造(中)

    构造函数:

    构造函数带参数的意义就是可以使得每个对象有不同的初始化状态。

    友情提醒:

    示例:

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

    19、20行都叫做对象的初始化,对象从无到有都叫做初始化,初始化的时候会调用构造函数。初始化和赋值是不同的,int i = 0是初始化, i = 1是赋值。赋值和初始化在C语言中的差距不大,但是在面向对象的语言中差距很大,因为初始化要调用构造函数。

    第22行是变量的初始化。

    结果如下:

    编译器根据构造函数的参数来匹配具体的构造函数,这就是重载规则。

    构造函数的调用:

    构造函数的手动调用示例:

    18行定义了类对象数组,可以看到构造函数调用了三次。

    如果我们想让数组中的每个对象的初始值不一样怎么办呢?

    这就需要手工调用构造函数。

     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 v) 
    15     { 
    16         printf("Test(int v), v = %d
    ", v);
    17         
    18         m_value = v;
    19     }
    20     int getValue()
    21     {
    22         return m_value;
    23     }
    24 };
    25 
    26 int main()
    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 }

     第28行是关键所在,这就会调用不同的构造函数了。

    35行的Test(100)就是手工调用构造函数的方式。

    运行结果如下:

     小实例:

    数组类的实现:

     1 #ifndef _INTARRAY_H_
     2 #define _INTARRAY_H_
     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
     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 void IntArray::free()
    45 {
    46     delete[]m_pointer;
    47 }

    主程序如下:

     1 #include <stdio.h>
     2 #include "IntArray.h"
     3 
     4 int main()
     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 }

    运行结果如下:

    小结:

  • 相关阅读:
    [QT_QML]qml假如调试信息 qDebug console.debug
    [QT_FFMPEG]学习问题: 刚开始移植ffmpeg,测试时出现 undefined reference to `avcodec_configuration()'
    [QT_OPENCV] qt下opencv配置以及首个opencv工程
    [QT][SQLITE]学习记录二 日期查询
    [QT][DEMO] QTableWidget 设置某一列禁止编辑
    [QT][SQLITE]学习记录一 querry 查询
    [QT]QPixmap图片缩放和QLabel 的图片自适应效果对比
    [QT]问题记录-QPixmap::scaled 缩放不成功
    利用php给图片添加文字水印--面向对象与面向过程俩种方法的实现
    利用javascript实现文本的自动输出
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/9568752.html
Copyright © 2011-2022 走看看