• 第17课 对象的构造(上)


    1. 对象的初始化

    (1)从程序设计的角度看,对象只是变量,因此:

      ①在栈上创建对象时,成员变量初始化为随机值

      ②在堆上创建对象时,成员变量初始化为随机值

      ③在静态存储区创建对象时,成员变量初始化为0

    【编程实验】成员变量的初始化   17-1.cpp

    #include <stdio.h>
    
     
    
    class Test
    
    {
    
    private:
    
        int i;
    
        int j;
    
     
    
    public:
    
        int getI(){return i;}
    
        int getJ(){return j;}
    
    };
    
     
    
    Test gt; //全局对象
    
     
    
    int main()
    {
    
        //全局区,被初始化为0
    
        printf("gt.i = %d
    ", gt.getI());//0
    
        printf("gt.j = %d
    ", gt.getJ());//0
    
     
    
        //栈上的对象,初始化为随机值
    
        Test st;
    
        printf("st.i = %d
    ", st.getI());//随机值
    
        printf("st.j = %d
    ", st.getJ());//随机值
    
     
    
        //堆上创建对象,初始化为随机值
    
        Test* pt = new Test;
    
        printf("pt->i = %d
    ", pt->getI());//随机值
    
        printf("pt->j = %d
    ", pt->getJ());//随机值  
    
     
    
        delete pt;
    
     
    
        return 0;
    
    }

    运行结果:

      

    (2)生活中的对象都是在初始化后上市的

    (3)初始状态(出厂设置)对象普遍存在一个状态,那么程序中如何对一个对象进行初始化

    (4)一般而言,对象需要一个确定的初始状态

    (5)解决方案:

    • 中提供一个publicinitialize函数
    • 对象创建后立即调用initialize函数进行初始化

          

    (6)存在的问题:

    • initailize只是一个普通函数,必须显式调用

    • 如果未调用initialize函数,运行结果是不确定的

    【编程实验】初始化函数  17-2.cpp

    #include <stdio.h>
    
    class Test
    {
    private:
        int i;
        int j;
    public:
        int getI() { return i; }
        int getJ() { return j; }
        void initialize()
        {
            i = 1;
            j = 2;
        }
    };
    
    Test gt;
    
    int main()
    {
        gt.initialize();
        
        printf("gt.i = %d
    ", gt.getI());
        printf("gt.j = %d
    ", gt.getJ());
        
        Test t1;
        
        t1.initialize();
        
        printf("t1.i = %d
    ", t1.getI());
        printf("t1.j = %d
    ", t1.getJ());
        
        t1.initialize();
        
        Test* pt = new Test;
        
        pt->initialize();
        
        printf("pt->i = %d
    ", pt->getI());
        printf("pt->j = %d
    ", pt->getJ());
        
        delete pt;
        
        return 0;
    }

    运行结果:

      

    2. 构造函数

    (1)C++中可以定义与类名相同特殊成员函数,这个函数叫构造函数

      ①构造函数没有任何返回类型(连void都没有,因为这个函数是编译器在创建对象时插入二进制代码用的,即由编译器来调用的

      ②构造函数对象定义时自动被调用

    【编程实验】构造函数初探  17-3.cpp

    #include <stdio.h>
    
     
    
    class Test
    
    {
    
    private:
    
        int i;
    
        int j;
    
     
    
    public:
    
        int getI(){return i;}
    
        int getJ(){return j;}
    
       
    
        //构造函数
    
        Test()
    
        {
    
            printf("Test() Begin
    ");
    
            i = 0;//成员变量初始化
    
            j = 0;//成员变量初始化
    
            printf("Test() End
    ");
    
        }
    
    };
    
     
    
    Test gt; //全局对象
    
     
    
    int main()
    
    {
    
        //全局区
    
        printf("gt.i = %d
    ", gt.getI());//0
    
        printf("gt.j = %d
    ", gt.getJ());//0
    
     
    
        //栈上的对象
    
        Test st;
    
        printf("st.i = %d
    ", st.getI());//0
    
        printf("st.j = %d
    ", st.getJ());//0
    
     
    
        //堆上创建对象
    
        Test* pt = new Test;
    
        printf("pt->i = %d
    ", pt->getI());//0
    
        printf("pt->j = %d
    ", pt->getJ());//0  
    
     
    
        delete pt;
    
     
    
        return 0;
    
    }

    运行结果:

      

    3. 小结

    (1)每个对象使用之前都应该初始化

    (2)构造函数用于对象的初始化

    (3)构造函数类同名并且没有任何类型的返回值

    (4)构造函数对象定义时自动被调用

  • 相关阅读:
    PHP filter_input_array() 函数
    pt-query-digest 用法
    [SDOI2017]苹果树
    C# json 转 xml 字符串
    C# json 转 xml 字符串
    C# double 好用的扩展
    C# double 好用的扩展
    win10 uwp 使用 Microsoft.Graph 发送邮件
    win10 uwp 使用 Microsoft.Graph 发送邮件
    Sublime Text 安装中文、英文字体
  • 原文地址:https://www.cnblogs.com/hoiday/p/10091314.html
Copyright © 2020-2023  润新知