zoukankan      html  css  js  c++  java
  • 面向对象——构造函数与析构函数(多语言比较——整合自网络)

    1






    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46

    我们在创建和销毁对象时需要执行一些任务。例如,在创建对象时给属性赋值,在对象销毁时关闭数据连接等,这时就需要构造函数和析构函数。

    c++ 包含构造函数和析构函数的C++程序。


    #include<string>
    #include<iostream>
    usingnamespacestd;
    classstud//声明一个类
    {
    private://私有部分
    intnum;
    charname[10];
    charsex;
    public://公用部分
    stud(intn,charnam[],chars)//构造函数
    {
    num=n;
    strcpy(name,nam);
    sex=s;
    }
    ~stud()//析构函数
    {
    cout<<"studhasbeendestructed!"<<endl;//通过输出提示告诉我们析构函数确实被调用了
    }
    voiddisplay()//成员函数,输出对象的数据
    {
    cout<<"num:"<<num<<endl;
    cout<<"name:"<<name<<endl;
    cout<<"sex:"<<sex<<endl;
    }
    };
    intmain()
    {
    studstud1(10010,"Wang-li",'f'),stud2(10011,"Zhang-fun",'m');//建立两个对象
    stud1.display();//输出学生1的数据
    stud2.display();//输出学生2的数据
    return0;
    }//主函数结束的同时,对象stud1,stud2均应被“清理”,而清理就是通过调用了析构函数实现的。
     
    /**********************
    输出结果:
    num:10010
    name:Wang-li
    sex:f
    num:10011
    name:Zhang-fun
    sex:m
    studhasbeendestructed!
    studhasbeendestructed!
    ***********************/

    现在把类的声明放在main函数之前,它的作用域是全局的。这样做可以使main函数更简练一些。在main函数中定义了两个对象并且给出了初值,然后输出两个学生的数据。当主函数结束时调用析构函数,输出stud has been destructe!。值得注意的是,真正实用的析构函数一般是不含有输出信息的。
    在本程序中,成员函数是在类中定义的,如果成员函数的数目很多以及函数的长度很长,类的声明就会占很大的篇幅,不利于阅读程序。而且为了隐藏实现,一般是有必要将类的声明和实现(具体方法代码)分开编写的,这也是一个良好的编程习惯。即可以在类的外面定义成员函数,而在类中只用函数的原型作声明。

    Python
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/user/bin/python
    #-*-coding:UTF-8-*-
     
    classFruit:
    def__init__(self,color):#初始化属性__color
    self.__color=color
    printself.__color
     
    def__del__(self):#析构函数
    self.__color=""
    print"free..."
     
    defgrow(self):
    print"grow..."
     
    if__name__=="__main__":
    color="red"
    fruit=Fruit(color)
    fruit.grow

    Php

    在PHP中构造函数和析构函数是固定的,如下:

    复制代码
    // 构造函数
    function __construct([argument1,argument2,...,argumentN]){
        /* Class initialization code */
    }
    
    // 析构函数
    function __destruct(){
        // ...
    }
    复制代码
    构造函数
    • 构造函数可以接受参数,能够在创建对象时赋值给对象属性
    • 构造函数可以调用类方法或其他函数
    • 构造函数可以调用其他类的构造函数

        构造函数使用例子:

    复制代码
    <?php
    class Person{
        private $name;
        private $age;
        private $gender;
    
        public function __construct($name,$age,$gender){
            $this->setName($name);
            $this->setAge($age);
            $this->setGender($gender);
        }
    
        public function setName($name){
            $this->name = $name;
        }
    
        // ... getter setter 方法
    
    }
    
    $peron = new Person("lee",18,'男');
    
    ?>
    复制代码

        调用父类构造函数、调用无关类的构造函数:

    function __construct(){
        parent::__construct(); // 调用父类的构造函数必须显示的使用parent调用父类构造函数
        classname::__construct(); // 调用其他类的构造函数,classname是类名
        //其他操作
    }
    继承和构造函数

        PHP中的子类的构造函数不会主动调用父类的构造函数,要显示的使用parent::__construct()调用:

    复制代码
    <?php
    class Animal{
        private $name;
        function __construct($name){
            $this->setName($name)
            echo "动物类被创建!";
        }
        // ... 其他方法
    
    }
    
    class Birds extends Animal{
        private $name;
        private $leg;
        function __construct($name,$leg){
            parent::__construct($name); // 显示调用
            $this->setLeg($leg);
            echo "鸟类被创建!";
        }
        // ... 其他方法
    }
    ?>
    复制代码

        如果涉及多层继承,当调用parent::__construct()时,会沿着父类向上搜索,直到找到最合适的构造函数,例如:

    复制代码
    // 接上例
    
    class Parrot extends Birds{
        private $name;
        private $leg;
        private $wing;
        function __construct($name){
            parent::__construct($name); // 此时没有找到父类(Birds类)合适的构造函数,只能向上搜索,搜索到Animal类时,才找到合适的构造函数
            echo "鹦鹉类被创建!";
            $this->smackTalk();
            /*
            输出结果:
            "动物类被创建!"
            "鹦鹉说话!"
            */
        }
        function smackTalk(){
            echo "鹦鹉说话!";    
        }
    
    }
    复制代码

        如果想要依次调用几个父类的构造函数,可以使用类名直接调用构造函数,例如:

    function __construct($name,$leg){
           Animal::__construct($name); // 调用Animal构造函数
            Birds::__construct($name,$leg); // 调用Birds构造函数
    }

       PHP是不支持函数的重载,所有构造函数同样不能有多个。

    析构函数
    • 析构函数是在销毁对象时,自动调用,不能显示的调用。
    • 析构函数不能带参数。

    在以下几种情况下可能会调用析构函数(但不一定):

    • PHP页面加载完毕之后;
    • unset()类;
    • 变量引用指向别的对象或值时;

    PHP的内存回收机制和JAVA的很类似,对没有任何引用的对象进行销毁回收,采用引用计数器的技术。

    例子:

    复制代码
    <?php
    class test{
        function __destruct(){
            echo "当对象销毁时会调用!!!";
        }
    
    }
    $a = $b = $c = new test();
    
    $a = null;
    unset($b);
    
    echo "<hr />";
    
    ?>
    复制代码

    此例子,如下图,有三个变量引用$a,$b,$c指向test对象,test对象就有3个引用计数,当$a = null时,$a对test对象的引用丢失,计数-1,变为2,当$b被unset()时,$b对test对象的引用也丢失了,计数再-1,变为1,最后页面加载完毕,$c指向test对象的引用自动被释放,此时计数再-1,变为0,test对象已没有变量引用,就会被销毁,此时就会调用析构函数。

    image

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    课程设计第十九天
    课程设计第十天八
    课程设计第十七天
    程序设计第十六天
    课程设计第十五天
    一个完整的大作业
    数据结构化与保存
    爬取新闻列表
    用requests库和BeautifulSoup4库爬取新闻列表
    中文词频统计及词云制作
  • 原文地址:https://www.cnblogs.com/sunscheung/p/4839422.html
Copyright © 2011-2022 走看看