zoukankan      html  css  js  c++  java
  • 对象的构造

    对象的初始化

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

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

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

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

    小结

    每个对象在使用之前都应该初始化

    类的构造函数用于对象的初始化

    构造函数与类同名并且没有返回值

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

    带有参数的构造函数

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

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

      构造函数的重载遵循c++重载的规则

    友情提醒

    对象定义和对象声明不同

      对象定义-申请对象的空间并调用构造函数

      对象声明-告诉编译器存在这样一个对象

    Test t;  //定义对象并调用构造函数

    int main()

    {

      //告诉编译器存在名为t的Test对象

      extern Test t;

      return 0;

    }

    构造函数的自动调用

    int main()

    {

      Test t;  //调用 Test()

      Test t1(1);  //调用Test(int v)

      Test t2 = 1;  //调用Test(int v)

      return 0;

    }

    构造函数的调用

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

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

    如何创建一个对象数组?

    Test ta[3] = {Test(), Test(1), Test(2)};

    特殊的构造函数

    两个特殊的构造函数

    无参构造函数

      没有参数的构造函数

      当类中没有定义构造函数时,编译器默认提供一个无参构造函数,并且其函数体为空

    拷贝构造函数

      参数为const class_name& 的构造函数

      当类中没有定义拷贝构造函数时,编译器默认提供一个拷贝构造函数,简单的进行成员变量的值复制

    拷贝构造函数的意义

      兼容c语言的初始化方式

      初始化行为能够符合预期的逻辑

    浅拷贝:拷贝后对象的物理状态相同

    深拷贝:拷贝后对象的逻辑状态相同

    编译器提供的拷贝构造函数只进行浅拷贝!

    什么时候需要进行深拷贝?

    对象中有成员指代了系统中的资源

      成员指向了动态内存空间

      成员打开了外存中的空间

      成员使用了系统中的网络端口

      ......

    一般性原则

      自定义拷贝构造韩寒苏,必然需要实现深拷贝!!!

    IntArray::IntArray(const IntArray& obj)

    {

      m_length = obj.m_length;

      m_pointer = new int[obj.m_length];

      for(int i=0; i<obj.m_length; i++)

      {

        m_pointer[i] = obj.m_pointer[i];

      }

    }

  • 相关阅读:
    企业级应用TOMCAT
    HTTP服务及状态码
    Zabbix服务网页报错汇总
    spring aop 嵌套方法注解不生效
    oracle数据库密码修改和解锁
    redis安装
    docker简介
    ffmpeg简介
    JAVA学习笔记之变量
    JAVA学习笔记之类和对象
  • 原文地址:https://www.cnblogs.com/sugarWill666/p/9064523.html
Copyright © 2011-2022 走看看