zoukankan      html  css  js  c++  java
  • C++中的构造析构函数

    一、构造函数

    1. 构造函数:这个成员函数名必须和类名相同,定义时可以有参数,但是不可以有任何返回类型的声明。

    2. 构造函数调用的三种方式

    Test t1(4);   //自动调用构造函数
    Test t2 = 5;  //自动调用构造函数
    Test t3 = Test(6); //主动调用构造函数

    3. 当类中已经写了构造函数了,C++将不再为类提供无参的空函数的默认构造函数。

    4. 当类中没有定义拷贝构造函数时,编译器会默认提供一个拷贝构造函数,简单的进行成员变量值复制,浅拷贝。拷贝构造函数的参数是同类对象的const引用,语义是用参数对象的内容初始化当前对象。

    Test(const Test &v)
    {......}

    函数调用时,若类的对象做为参数或返回,会自动调用拷贝构造函数,用来完成对象值的传递。也就意味在在已有数值的基础上生成新的对象。当直接用一个对象去初始化另一个对象时,也会自动调用拷贝构造函数。

    对象之间的赋值是通过拷贝构造函数实现的,类似于赋值符号"="重载,能赋值过去多少,取决于拷贝构造函数

    若是没有提供拷贝构造函数,C++提供的默认的拷贝构造函数会进行成员变量的全部一一拷贝,但不会做其它事情,比如申请内存。

    注意: 使用一个对象去初始化另一个对象使用的是拷贝构造函数,例如 Array a2=a1; 对象间的赋值调用的是"="重载,例如 a2=a1;

    5. 成员函数可以重载,构造函数也可以重载。

    6. 可以在代码中直接调用构造,产生一个临时对象,又立即析构了。

    7. 在类定义中成员变量是不允许被赋初值的,比如成员变量const int c; 若不在类中定义需要赋初值。

    类的const成员会被分配空间的,本质是只读变量。因为编译时不知道其值是多少,因此不会进入符号表。const成员变量必须在初始化列表中进行初始化

    8. 构造函数的初始化列表,格式为: 类名::类名():m1(v1), m2(v1,v2), m3(v3)  其中”类名::类名()”是构造函数,分号后面是初始化列表,m1 m2 m3是(类)成员变量,v1 v2 v3是初始化值。

    注意:成员变量的初始化顺序与声明的顺序相关,与在初始化列表中的顺序无关。初始化列表先于构造函数的函数体执行。

    9. 构造函数的调用次序为: 当类中的成员变量是其它类的对象时,首先调用成员变量的构造函数,调用顺序与声明顺序相同,之后再调用类自身的构造函数。

    析构函数的调用程序与对应的构造函数调用的次序相反。

    10. 构造函数使用默认参数挺好

    Test(int a = 0, int b = 0)
    {
        this->a = a;
        this->b = b;      
    }
    //调用:
    Test t1;
    Test t1(1);
    Test t1(1, 2);

    二、析构函数

    1. 析构函数定义为 ~ClassName(),析构函数没有参数,没有任何返回类型的声明。析构函数只有一个,没有参数,因此不可重载。一个对象在销毁时自动调用析构函数。

  • 相关阅读:
    Java系列: JAVA字符串格式化-String.format()的使用(zz)
    Eclipse系列: 在Eclipse中用TODO标签管理任务(Task)(ZZ)
    JNDI全面总结(zz)
    Java Platform Standard Edition 8 Documentation
    JAVA NIO是什么(zz)
    Java NIO框架Mina、Netty、Grizzly介绍与对比(zz)
    Bootstrap系列 -- 25. 下拉菜单分割线
    Bootstrap系列 -- 24. 下拉菜单基本用法
    Bootstrap系列 -- 23. 图片
    Bootstrap系列 -- 22. 按钮详解
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/14585880.html
Copyright © 2011-2022 走看看