C++中的构造函数和析构函数(传智-王保明)

基本概念

构造函数总结

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

构造函数在对象创建时自动被调用(默认调用),隐身调用

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

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

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

 

构造函数的调用  

自动调用:一般情况下C++编译器会自动调用构造函数

手动调用:在一些情况下则需要手工调用构造函数

构造函数有三种

有参构造函数、默认构造函数、拷贝构造函数

析构函数

 

有参构造函数调用的三种方法

//
class Test
{
public:
 
         //有参构造函数
         Test(int   a)
         {
                   m_a   = a;
         }
         //无参数构造函数
         Test()
         {
                   m_a   = 0;
         }
         //四种应用场景
         //赋值构造函数 copy构造函数
         Test(const   Test &obj)
         {
 
         }
public:
         void   print()
         {
                   cout<<"m_a"<<m_a<<endl;
         }
protected:
private:
         int   m_a;
};
 
void main66()
{
 
         //括号法
         Test   t1(10); //c++编译器自动调用这个类的有参构造函数
         t1.print();
         //=
         Test   t2 = 20; //c++编译器自动调用这个类的有参构造函数
         t2.print();
         //
         Test   t3 = Test(30);//程序员手工的调用构造函数 进行对象初始化
         t3.print();
         system("pause");
}


 

构造函数用来完成对象的构造(初始化)工作,

赋值构造函数(copy构造函数) = 操作是两个不同的概念

赋值构造函数(copy构造函数)的四个应用场景


void main81()
{
 
         Test88   t1;
         //t1.SetBuf("我是t1");
         t1.setA(10);
 
         
         Test88   t3;
         //第一种场景
         //1赋值构造函数和=操作是两个不同的概念
         //2  赋值构造函数 copy构造函数 也是构造函数
         //在这个场景之下。t2被创建,并且自动的调用copy构造  
         //3   当我们没有编写copy构造函数(赋值构造函数)的时候,c++编译器会默认给我们提供一个copy构造函数   执行的是浅copy
         Test88   t2 = t1; //对象t2的初始化
         cout<<t2.getA()<<endl;
 
         //t2   = t1; //是对象的=操作
         system("pasue");
}


void main888()
{
 
         Test88   t1;
         t1.setA(10);
 
         //第二种场景
         Test88   t2(t1);
 
         system("pasue");
}


void f ( Location  p )      
{
         cout   << "Funtion:" << p.GetX() << ","   << p.GetY() << endl ; 
}
void playobjmain()
{ 
         Location   A ( 1, 2 ) ; 
         f   ( A ) ;
}


class Location 
{
public:
         Location(   int xx = 0 , int yy = 0 ) 
         {   
                   X   = xx ;  Y = yy ;  cout << "Constructor   Object.\n" ;  
         }
         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 ;
} ;
 
void f ( Location  p )      
{
         cout   << "Funtion:" << p.GetX() << ","   << p.GetY() << endl ; 
}
// void playobjmain()
// { 
//     Location   A ( 1, 2 ) ; 
//     f   ( A ) ;
// } 
Location g()
{
         Location   A(1, 2);
         return   A;
}
void main101()
{ 
         Location   B;
         B   = g();
         
} 
 
void main102()
{ 
         //g()   返回一个匿名对象
         Location   B = g();
}
 
void main1111()
{ 
         main102();
         system("pause");
}


 

 

构造函数析构函数调用规则

规则总结:

/*

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

2 当类中定义了任意的非拷贝构造函数(无参、有参),c++编译器不会提供无参构造函数

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

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

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

*/

 

//对象做函数参数

//1 研究拷贝构造

//2 研究构造函数,析构函数的调用顺序

 

//总结 构造和析构的调用顺序

 

#include "iostream"
using namespace std;
 
class ABCD 
{
public:
         ABCD(int   a, int b, int c)
         {
                   this->a   = a;
                   this->b   = b;
                   this->c   = c;
                   printf("ABCD()   construct, a:%d,b:%d,c:%d  \n",   this->a, this->b, this->c);
         }
         ~ABCD()
         {
                   printf("~ABCD()   construct,a:%d,b:%d,c:%d  \n",   this->a, this->b, this->c);
         }
         int   getA() 
         {
                   return   this->a;
         }
protected:
private:
         int   a;
         int   b;
         int   c;
};
 
 
class MyE
{
public:
         MyE():abcd1(1,2,3),abcd2(4,5,6),m(100)
         {
                   cout<<"MyD()"<<endl;
         }
         ~MyE()
         {
                   cout<<"~MyD()"<<endl;
         }
         MyE(const   MyE & obj):abcd1(7,8,9),abcd2(10,11,12),m(100)
         {
                   printf("MyD(const   MyD & obj)\n");
         }
 
protected:
         //private:
public:
         ABCD   abcd1; //c++编译器不知道如何构造abc1
         ABCD   abcd2;
         const   int m;
 
};
 
int doThing(MyE mye1)
{
         printf("doThing()   mye1.abc1.a:%d \n", mye1.abcd1.getA()); 
         return   0;
}
 
int run2()
{
         MyE   myE;
         doThing(myE);
         return   0;
}
 
//
int run3()
{
         printf("run3   start..\n");
         
         ABCD   abcd = ABCD(100, 200, 300);
         //若直接调用构造函数哪
         //想调用构造函数对abc对象进行再复制,可以吗?
         //在构造函数里面调用另外一个构造函数,会有什么结果?
         //ABCD(400,   500, 600); //临时对象的生命周期
         printf("run3   end\n");
         return   0;
}
 
int main()
{
         //run2();
         run3();
         system("pause");
         return   0;
}


 

 



乐享:知识积累,快乐无限。