zoukankan      html  css  js  c++  java
  • 试验C++构造函数,析构函数,拷贝构造函数和赋值构造函数

    http://tangfeng.iteye.com/blog/89140

    试验C++构造函数,析构函数,拷贝构造函数和赋值构造函数 

    #include "stdafx.h"
    #include <iostream>
    #include <string.h>

    using namespace std;

    class student
    {
    public:
     student()
     {
      cout<<"default constructor is called!"<<endl;
      name=new char[1];
      name[0]='\0';
      age=0;
     }
     student(char* name,int age)
     {
      if(name==NULL)
      {
       this->name=new char[1];
       name[0]='\0';
      }
      else
      {
       this->name=new char[strlen(name)+1];
       strcpy(this->name,name);
       cout<<"constructing student:"<<this->name<<endl;
       this->age=age;
      }
     }
     student(const student& stu)
     {
      this->name=new char[strlen(stu.name)+strlen("copy of")+1];
      strcpy(this->name,stu.name);
      strcat(this->name,"copy of");
      cout<<"constructing student:"<<this->name<<endl;
      this->age=stu.age;
      
     }
     student& operator=(const student& stu)
     {
      if(this==&stu)  //检查自赋值用指针比较,不能用对象比较,对象比较函数未定义
       return *this;
      if(this->name)
       delete this->name;
      this->name=new char[strlen(stu.name)+strlen("===construct")+1];
      strcat(stu.name,"===construct");
      strcpy(this->name,stu.name);
      cout<<"constructing student by ====!"<<endl;
      this->age=stu.age;
      return *this;
     }
     ~student()
     {
      cout<<"destructing student:"<<this->name<<"age:"<<this->age<<endl;

      if(this->name)
       delete this->name;
      this->name=NULL;
     }
    private:
     char* name;
     int age;
    };
    student test(student s)     //实参传递给形参的时候调用拷贝构造函数
    {
     cout<<"in the test function!"<<endl;
     student s2("temp",22);
     //返回临时对象前先拷贝构造一个临时对象,然后复制给实参
     //返回栈空间,程序本身有问题。但是拷贝构造函数将原来的对象在一个新空间构造,
     //所以不存在内存泄露。
     return s2; //好像编译器调用析构函数去析构自己产生的临时对象出错
    }
    int main(int argc, char* argv[])
    {
     cout<<"start the programing!"<<endl;
     student stu("roger",11);
     cout<<"to execute the test()!"<<endl;
     //int i=0;
     //while(i++<10000000)
     student s3("gugy",23);
     s3=test(stu);   //调用赋值函数
     cout<<"exit the programing!"<<endl;
     return 0;
    }

  • 相关阅读:
    21-MySQL-Ubuntu-快速回到SQL语句的行首和行末
    2- SQL语句的强化
    1-数据准备
    20-MySQL-Ubuntu-数据表的查询-子查询(九)
    19-MySQL-Ubuntu-数据表的查询-自关联(八)
    18-MySQL-Ubuntu-数据表的查询-连接(七)
    17-MySQL-Ubuntu-数据表的查询-分页(六)
    16-MySQL-Ubuntu-数据表的查询-分组与聚合(五)
    15-MySQL-Ubuntu-数据表的查询-聚合函数(四)
    14-MySQL-Ubuntu-数据表的查询-范围查询(三)
  • 原文地址:https://www.cnblogs.com/wb118115/p/2759665.html
Copyright © 2011-2022 走看看