c++ 关于构造函数 和 复制构造函数

来源:互联网 发布:淘宝刷单权重 编辑:程序博客网 时间:2024/06/05 15:53

1  构造函数

     在c++中构造函数是特殊的成员函数,只要创建了类的实例都要执行构造函数,构造函数的名称与类名相同,且没有返回值,可以没有形参,也可以有多个形参。

    构造函数可以包含一个构造函数的初始化列表:

         A::A(int a ):b(a),c(a)

    构造函数的初始化次序为就是定义成员的次序,第一个成员首先被初始化,然后第二个,初始化测次序往往无关紧要,但如果一个成员是根据其他成员初始化的,就要考虑次序了。

         

2 复制构造函数

   只有一个形参,并且该形参是对本类型对象的引用,这样的构造函数时复制构造函数。

    复制构造函数可用于:

      1 根据另一个同类型的对象显式或隐式初始化一个对象

      2 复制一个对象 将他作为一个实参传给一个函数
      3 对象作为函数的返回值
      4 初始化顺序容器的元素

    若一个类需要完全禁止复制,类必须显式声明其复制构造函数为private

3  关于构造函数和复制构造函数的调用
    先看如下代码
     
class People{private:int m;int n;public:People(){cout<<"构造函数调用"<<endl;} ~People() { cout<<"析构函数调用"<<endl; }  People(const People&s) { m = s.m; n = s.n; cout<<"复制构造函数调用"<<endl; } People  operator =(const People&w) {  m = w.m;  n = w.n;  cout<<"复制运算符重载调用"<<endl;  return *this; }void SetM(int m){this->m = m;}void SetN(int n){this->n = n;}void show(){cout<<"M:"<<m<<endl;cout<<"N:"<<n<<endl;}};People func3(){People people;//调用构造函数people.SetM(10);people.SetN(5);return people;//产生临时变量,调用复制构造函数,和析构函数}<pre name="code" class="cpp">void main(){  People p = func3();  p.show();
            //运行结束后调用析构函数}
    运行的结果为:
           构造函数调用
            复制构造函数调用
             析构函数调用
             M:10
             N:5
            析构函数调用

对比
     
<span style="color:#666666;">class People{private:int m;int n;public:People(){cout<<"构造函数调用"<<endl;} ~People() { cout<<"析构函数调用"<<endl; }  People(const People&s) { m = s.m; n = s.n; cout<<"复制构造函数调用"<<endl; } People  operator =(const People&w) {  m = w.m;  n = w.n;  cout<<"复制运算符重载调用"<<endl;  return *this; }void SetM(int m){this->m = m;}void SetN(int n){this->n = n;}void show(){cout<<"M:"<<m<<endl;cout<<"N:"<<n<<endl;}};People* func3(){People *p = new People();//调用构造函数p->SetM(10);                                                                          p->SetN(10);return p;}int main(){People *p = func3();p->show();    delete p;//调用析构函数}</span><span style="color:#ff6666;"></span>
     运行结果为:
         构造函数调用
         M:10
         N:10
        析构函数调用

     因在func3() 中返回的是指针,复制的是指针的指向,因此不会调用复制构造函数,C++ 中 new出的对象都会调用构造函数,不会自动调用析构函数析构,需手动的delete该对象才会析构

对比   
     
<span style="color:#666666;">class People{private:int m;int n;public:People(){cout<<"构造函数调用"<<endl;} ~People() { cout<<"析构函数调用"<<endl; }  People(const People&s) { m = s.m; n = s.n; cout<<"复制构造函数调用"<<endl; } People  operator =(const People&w) {  m = w.m;  n = w.n;  cout<<"复制运算符重载调用"<<endl;  return *this; }void SetM(int m){this->m = m;}void SetN(int n){this->n = n;}void show(){cout<<"M:"<<m<<endl;cout<<"N:"<<n<<endl;}};People* func3(){People *p = new People();//调用构造函数p->SetM(10);                                                                          p->SetN(10);return p;}int main(){ People *p = func3();     People *w = new People; *w = *p; delete p; delete w;}</span>
   结果:
       构造函数调用
       构造函数调用
       复制运算符重载
       复制构造函数调用
       析构函数调用
        析构函数调用
        析构函数调用

   在func3()中会调用一此构造函数,在People *w = new People 中调用构造函数,在*w = *p中,调用赋值运算符重载,又因在赋值运算符重载中,返回*this,固会调用复制构造函数和析构函数,delete p和delete w调用两次析构函数
    


0 0