zoukankan      html  css  js  c++  java
  • 拷贝构造函数

    拷贝构造函数调用时机(用一个对象初始化另一个对象时)

    赋值构造函数的四种调用场景(调用时机)

    第1和第2个调用场景

    #include "iostream"

    using namespace std;

    class AA

    {

    public:

             AA() //无参构造函数 默认构造函数

             {       

                       cout<<"我是构造函数,自动被调用了"<<endl;

             }

             AA(int _a) //无参构造函数 默认构造函数

             {       

                       a = _a;

             }

            AA(const AA &obj2)//拷贝构造函数 (也叫赋值构造函数)   红色部分是类本身的名字

            {

                     cout<<"我也是构造函数,我是通过另外一个对象obj2,来初始化我自己"<<endl;

                     a = obj2.a + 10;

            }

             ~AA()

             {

                       cout<<"我是析构函数,自动被调用了"<<endl;

             }

             void getA()

             {

                       printf("a:%d ", a);

             }

    protected:

    private:

             int a;

    };

    //单独搭建一个舞台

    void ObjPlay01()

    {

             AA a1; //变量定义

            

             //赋值构造函数的第一个应用场景(等号法)

             //用对象1 初始化 对象2

             AA a2 = a1; //定义变量并初始化 //初始化法(等号法)

             a2 = a1; //用a1来=号给a2 编译器给我们提供的浅copy

    }

    第二个应用场景

    //单独搭建一个舞台

    void ObjPlay02()

    {

             AA a1(10); //变量定义

             //赋值构造函数的第二个应用场景括号法

             //用对象1 初始化 对象2

             AA a2(a1); //定义变量并初始化 //括号法

             //a2 = a1; //用a1来=号给a2 编译器给我们提供的浅copy

             a2.getA();

    }

    //注意:初始化操作 和 等号操作 是两个不同的概念

    第3个调用场景  类作为函数参数

    #include "iostream"

    using namespace std;

    class Location

    {

    public:

             Location( int xx = 0 , int yy = 0 )

             {

                       X = xx ;  Y = yy ;  cout << "Constructor Object. " ;

             }

             Location( const Location & p )            //复制构造函数

             {

                       X = p.X ;  Y = p.Y ;   cout << "Copy_constructor called." << endl ; 

             }

             ~Location()

             {

                       cout << X << "," << Y << " Object destroyed." << endl ;

             }

             int  GetX () { return X ; }          int GetY () { return Y ; }

    private :   int  X , Y ;

    } ;

    //alt + f8 排版

    void f ( Location  p )  

    {

             cout << "Funtion:" << p.GetX() << "," << p.GetY() << endl ;

    }

    void mainobjplay()

             Location A ( 1, 2 ) ;  //形参是一个元素,函数调用,会执行实参变量初始化形参变量

             f ( A ) ;

    }

    void main()

             mainobjplay();

             system("pause");

    }

    第4个调用场景  作函数返回值

    第四个应用场景

    #include "iostream"

    using namespace std;

    class Location

    {

    public:

             Location( int xx = 0 , int yy = 0 )

             {

                       X = xx ;  Y = yy ;  cout << "Constructor Object. " ;

             }

             Location( const Location & p )            //复制构造函数

             {

                       X = p.X ;  Y = p.Y ;   cout << "Copy_constructor called." << endl ; 

             }

             ~Location()

             {

                       cout << X << "," << Y << " Object destroyed." << endl ;

             }

             int  GetX () { return X ; }          int GetY () { return Y ; }

    private :   int  X , Y ;

    } ;

    //alt + f8 排版

    void f ( Location  p )  

    {

             cout << "Funtion:" << p.GetX() << "," << p.GetY() << endl ;

    }

    Location g()

    {

             Location A(1, 2);

             return A;

    }

    //对象初始化操作 和 =等号操作 是两个不同的概念

    //匿名对象的去和留,关键看,返回时如何接

    void mainobjplay()

             //若返回的匿名对象,赋值给另外一个同类型的对象,那么匿名对象会被析构

             //Location B;

             //B = g();  //用匿名对象 赋值 给B对象,然后匿名对象析构

             //若返回的匿名对象,来初始化另外一个同类型的对象,那么匿名对象会直接转成新的对象

             Location B = g();

             cout<<"传智扫地僧测试"<<endl;

    }

    void main()

             mainobjplay();

             system("pause");

    }

     

    4默认构造函数

    二个特殊的构造函数

    1)默认无参构造函数

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

    2)默认拷贝构造函数

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

    5构造函数调用规则研究

    1)当类中没有定义任何一个构造函数时,c++编译器会提供默认无参构造函数和默认拷贝构造函数

    2)当类中定义了拷贝构造函数时,c++编译器不会提供无参数构造函数

    3) 当类中定义了任意的非拷贝构造函数(即:当类中提供了有参构造函数或无参构造函数),c++编译器不会提供默认无参构造函数

    4 )默认拷贝构造函数成员变量简单赋值

    总结:只要你写了构造函数,那么你必须用。

    构造析构阶段性总结

    1)构造函数是C++中用于初始化对象状态的特殊函数

    2)构造函数在对象创建时自动被调用

    3)构造函数和普通成员函数都遵循重载规则

    4)拷贝构造函数是对象正确初始化的重要保证

    5)必要的时候,必须手工编写拷贝构造函数

    ========》1个对象的初始化讲完了,增加一个案例。

  • 相关阅读:
    Echarts、大屏动态折线图无状态加载
    地图获取城市编码vue-jsonp请求,处理跨域
    将数组中的元素拼接为一个字符串
    vue兄弟组件通信、兄弟组件传值(本人是用的是中央控件作为媒介),并一同解决重负传值、第一未传值
    vue、react动态新增行
    vue-antd 分页pagination相关重置问题
    关闭ESLint警告,本人使用的是vue-antd-pro
    文本长短不一文本长短不一致,css让其左右两侧对齐致,css让其左右两侧对齐
    Maven私服搭建 Nexus
    Maven常用命令
  • 原文地址:https://www.cnblogs.com/long5683/p/11397439.html
Copyright © 2011-2022 走看看