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个对象的初始化讲完了,增加一个案例。

  • 相关阅读:
    解析大型.NET ERP系统 权限模块设计与实现
    Enterprise Solution 开源项目资源汇总 Visual Studio Online 源代码托管 企业管理软件开发框架
    解析大型.NET ERP系统 单据编码功能实现
    解析大型.NET ERP系统 单据标准(新增,修改,删除,复制,打印)功能程序设计
    Windows 10 部署Enterprise Solution 5.5
    解析大型.NET ERP系统 设计异常处理模块
    解析大型.NET ERP系统 业务逻辑设计与实现
    解析大型.NET ERP系统 多国语言实现
    Enterprise Solution 管理软件开发框架流程实战
    解析大型.NET ERP系统 数据审计功能
  • 原文地址:https://www.cnblogs.com/long5683/p/11397439.html
Copyright © 2011-2022 走看看