zoukankan      html  css  js  c++  java
  • 第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)构造函数对象定义时自动被调用

  • 相关阅读:
    服务部署 RPC vs RESTful
    模拟浏览器之从 Selenium 到splinter
    windows程序设计 vs2012 新建win32项目
    ubuntu python 安装numpy,scipy.pandas.....
    vmvare 将主机的文件复制到虚拟机系统中 安装WMware tools
    ubuntu 修改root密码
    python 定义类 简单使用
    python 定义函数 两个文件调用函数
    python 定义函数 调用函数
    python windows 安装gensim
  • 原文地址:https://www.cnblogs.com/hoiday/p/10091314.html
Copyright © 2011-2022 走看看