美文网首页
C++构造函数,析构函数,拷贝构造函数初识

C++构造函数,析构函数,拷贝构造函数初识

作者: 司马捷 | 来源:发表于2016-07-20 16:42 被阅读19次
    //
    //  main.cpp
    //  拷贝构造函数
    //
    //  Created by Eric on 16/7/20.
    //  Copyright © 2016年 Eric. All rights reserved.
    //
    
    #include <iostream>
    using namespace std;
    
    /**
     *  3.拷贝构造函数调用的三种形式
     3.1.一个对象作为函数参数,以值传递的方式传入函数体;
     3.2.一个对象作为函数返回值,以值传递的方式从函数返回; 
     3.3.一个对象用于给另外一个对象进行初始化(常称为复制初始化)。
     */
    
    /**
     *  当产生新对象,用已有对象去初始化新对象时才会调用拷贝构造函数
     */
    
    class Location
    {
    public:
        /**
         *  含参构造函数
         */
        Location(int x = 0,int y = 0){
            _x = x;
            _y = y;
            _myP = (char *)malloc(100);
            strcpy(_myP, "adfadaf");
            
            cout<<"Constructor Object.\n";
        }
        Location(const Location &obj){
            cout<<"调用拷贝构造函数 \n";
        }
        /**
         *  析构函数
         */
        ~Location(){
            cout<<_x<<","<<"Object destroryed"<<endl;
            if (_myP != NULL) {
                free(_myP);
            }
        }
        
        int getX(){
            return _x;
        }
    private:
        int _x,_y;
        
        char *_myP;
    };
    
    class A{
        A(int a){
            _a = a;
        };
    private:
        int _a;
    };
    
    
    Location createLocation(){
        
        Location L(10,20);
        printf("---->%p\n",&L);
        return L;
    }
    
    void testFunction(){
        createLocation();
    }
    
    void testFunction2(){
        Location a = createLocation();
        printf("---->%p\n",&a);
        printf("对象被扶正:m:%d\n",a.getX());
    }
    void testFunction3(){
        Location B(5,2);
        //
        Location C = B;
        printf("C:m:%d\n",C.getX());
    }
    void testFunction4(){
        Location B(5,2);
        //
        Location C(19,20);
        C = B;
        printf("C:m:%d\n",C.getX());
    }
    int main(int argc, const char * argv[]) {
        // insert code here...
        std::cout << "Hello, World!\n";
        
    //    testFunction();
    //    testFunction2();
    //    testFunction3();//内存泄露  显示的调用了内存拷贝函数 
          testFunction4();//内存泄露   隐式的调用了内存拷贝函数
    //    
    //    Location D;
    //    
    //    D = B;
        
        return 0;
    }
    

    关键总结:

    当产生新对象,用已有对象去初始化新对象时才会调用拷贝构造函数

    相关文章

      网友评论

          本文标题:C++构造函数,析构函数,拷贝构造函数初识

          本文链接:https://www.haomeiwen.com/subject/isivjttx.html