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

    //构造函数--析构函数
    #include<iostream>
    using namespace std;
    class Point{
    public:
        /*无参构造函数*/
        Point(){
            x = 0;
            y = 1;
            cout << "无参构造函数被执行了.." << endl;
        }
        /*有参构造函数*/
        Point(int _x, int _y = 3){
            x = _x;
            y = _y;
            cout << "有参构造函数被执行了.." << "x=" << x << "y=" << y << endl;
        }
        /*拷贝构造函数*/
        Point(Point &pm){
            x = pm.x;
            y = pm.y;
            cout << "拷贝构造函数被执行了.." << "x=" << x << "y=" << y << endl;
        }
        ~Point(){
            cout << "析构函数被执行了.." << "x=" << x << "y=" << y << endl;
        }
    private:
        int x;
        int y;
    };
    
    //有参构造函数用法
    void Ptest(){
        Point pt1;
        //在类定义的时候,如果没有手动调用构造函数,c++编译器会自动调用类的无参构造函数来初始化类
        //在调用无参构造函数的时候,c++编译器会优先调用程序员所写的无参构造函数,如果没有自定义的构造函数,
        //c++编译器会生成默认的无参构造函数
    
        //有参构造函数的三种调用方式‘
        //方式一
        Point pt2(0, 0);
        //方式二
        Point pt3 = Point(1, 1);
        //方式三  
        Point pt4 = (2, 2);
    }
    
    void Ptest3(Point pm){
        ;
    }
    
    Point Ptest4(){
        Point pt;
        return pt;
    }
    
    //拷贝构造函数用法
    void Ptest2(){
        Point pt1;
        //方式一
        Point pt2 = pt1;
    
        Point pt3;//此处调用无参构造函数
        //注意:pt3 = pt1;此时没用调用拷贝构造函数,只是类的赋值
        pt3 = pt1;
    
        //方式二
        Point pt4(pt3);
    
        //方式三
        Point pt5;
        Ptest3(pt5);
        //在调用函数Ptest3(),这里的实参是point类对象,形参也是一个point类对象,这时候c++编译器会执行拷贝函数
    
        //方式四
        Point pt6;
        pt6 = Ptest4();
        //说明:Point pt6;调用了无参构造函数 
        //进入函数Ptest4();①:执行Point pt;生成一个临时类对象 pt,调用无参构造函数,
        //②:执行return pt;c++编译器会生成一个Point的临时对象(跟return 1;不一样,return 1没有生成临时变量存储1)
        //此时会调用拷贝构造函数,初始化这个临时对象,并且析构pt这个对象;③:pt6 = Ptest4();完成对象间的赋值操作
        //执行完成Ptest2()函数  执行pt6的析构函数
    
        //特殊案例
        Point pt7 = Ptest4();
        //通过观察发现 pt7不会调用任何构造函数,这是因为c++编译器把返回的这个临时对象直接转化成pt7了
        //结论:如果返回的匿名对象,来初始化另一个同类型的类对象,那么匿名对象会直接转成新的对象
        //但是pt6本质上是一个赋值操作,并非初始化
    }
    
    
    
    void main(){
        Ptest2();
        system("pause");
    }
  • 相关阅读:
    Hibernate总结(二)---hibernate中的各种映射
    调度子系统7_负载均衡(四)
    (网络层: 二 ) 网络层提供的服务(基于无连接的服务)
    我的2013——一名计算机教师的高开低走
    文艺小青年
    图解RabbitMQ
    解决Mac下idea运行速度慢
    较主流的消息队列的比较与选型
    Ubuntu下RabbitMQ安装
    linux守护进程与&的区别
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5604477.html
Copyright © 2011-2022 走看看