构造函数与析构函数调用技巧

1、构造函数含义:成员函数名与包含它的类的类名一致,此成员函数称构造函数

2、构造函数特点:构造函数是一种特殊的成员函数,不需用户调用,建立对象时自动执行,但我们也可手工调用。

形式
class Test2
{
    public:
    Test2()  //无参数构造函数
    {
        m_a = 0;
        m_b = 0;
    }
    Test2(int a)//有参构造函数
    {
        m_a = a;
        m_b = 0;
    }

    Test2(int a, int b) //有参数构造函数  
    {
        m_a = a;
        m_b = b;
    }
    //赋值构造函数 (copy构造函数) 
    Test2(const Test2& obj )
    {
        cout<<"我是构造函数 " <<endl;
    }
    public:
    void printT()
    {
        cout<<"普通成员函数"<<endl;
    }
    private:
    int m_a;
    int m_b;
};
//无参构造函数的调用
void main()
{
    Test2 t0;  //创建对象时,什么都不写默认调用无参数的构造函数
    return ;
} 
无参构造函数的调用
class Test2
{
    public:
    Test2()  //无参数构造函数
    {
        m_a = 0;
        m_b = 0;
    }
    Test2(int a)//有参构造函数
    {
        m_a = a;
        m_b = 0;
    }

    Test2(int a, int b) //有参数构造函数  
    {
        m_a = a;
        m_b = b;
    }
    //赋值构造函数 (copy构造函数) 
    Test2(const Test2& obj )
    {
        cout<<"我是构造函数 " <<endl;
    }
    public:
    void printT()
    {
        cout<<"普通成员函数"<<endl;
    }
    private:
    int m_a;
    int m_b;
};
//有参构造函数的调用
void main()
{
    //1括号法 
    Test2 t1(1, 2);  //调用两参数的构造函数
    // 2 =号法
    Test2 t2 = (3, 4, 5, 6, 7); // = c++对等号符 功能增强 
    Test2 t3 = 5;
    //3 直接调用构造函数  手动的调用构造函数
    Test2 t4 = Test2(1, 2);   //产生匿名对象  ,t4对象的初始化
    //
    t1 =  t4;  //把t4 copy给 t1  //赋值操作 
    //对象的初始化 和 对象的赋值 是两个不同的概念 
    return ;
} 
有参构造函数的调用
class Test4
{
public:
	Test4()  //无参数构造函数
	{
	    m_a = 0;
	    m_b = 0;
	}
	Test4(int a)
	{
            m_a = a;
        m_b = 0;
	}
	Test4(int a, int b) //有参数构造函数   //3种方法
	{
	    m_a = a;
	    m_b = b;
	}
	//赋值构造函数 (copy构造函数) //
	Test4(const Test4& obj )
	{
	    m_b = obj.m_b + 100;
	    m_a = obj.m_a + 100;
	}
public:
	void printT()
	{
	  cout<<"普通成员函数"<<endl;
       cout<<"m_a"<<m_a<<" m_b"<<m_b<<endl;
	}
private:
	int m_a;
	int m_b;
};

//1  赋值构造函数 用1个对象去初始化另外一个对象  
void main()
{
	Test4 t1(1, 2);
	Test4 t0(8, 9);

	//这两个都会调用赋值构造函数
	Test4 t2 = t1; //用t1来初始化 t2 ,会调用赋值构造函数。t1明显就是obj,然后t2的成员变量就可以用t1的成员变量来控制,类似t2为数学上的的因变量,t1为自变量,t2=f(t1)
        Test2 t5 (t1);//调用匿名对象

     //下面这两个不会
     Test4 t4 = Test4(1,4); // t4对象的初始化。如 参数构造函数里面有与t4名称相同的成员变量赋值操作,则后者(t4)与前者的相同变量值也会相等。
     t0 = t1; //用t1 给 t0赋值操作(是共同的成员变量赋值) 。和初始化是两个不同的概念
	t2.printT();//结果为 m_a=101   m_b=102  这是t2成员变量新的私有值
     t4.printT();//结果为 m_a=1 m_b=4 这是t4成员变量新的私有值
t0.printT();//结果为 m_a=1 m_b=2 这是t0成员变量新的私有值
t5.printT();//结果为 m_a=101 m_b=102 这是t5成员变量新的私有值
return ; }

  

cout<<"有参数构造函数"<<endl;}
//赋值构造函数 (copy构造函数) //Test4(const Test4& obj ){cout<<"我也是构造函数 " <<endl;m_b = obj.m_b + 100;m_a = obj.m_a + 100;}
public:void printT(){cout<<"普通成员函数"<<endl;cout<<"m_a"<<m_a<<" m_a"<<m_b<<endl;}private:int m_a;int m_b;};
//1  赋值构造函数 用1个对象去初始化另外一个对象  void main41(){Test4 t1(1, 2);Test4 t0(1, 2);
//赋值=操作 会不会调用构造函数//operator=()//抛砖t0 = t1; //用t1 给 t0赋值  到操作 和 初始化是两个不同的概念
//第1种调用方法Test4 t2 = t1; //用t1来初始化 t2 t2.printT();cout<<"hello..."<<endl;system("pause");return ;}

猜你喜欢

转载自www.cnblogs.com/anSn/p/11589032.html
今日推荐