试验C++构造函数,析构函数,拷贝构造函数和赋值构造函数
Posted zsl6658
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了试验C++构造函数,析构函数,拷贝构造函数和赋值构造函数相关的知识,希望对你有一定的参考价值。
试验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;
}
以上是关于试验C++构造函数,析构函数,拷贝构造函数和赋值构造函数的主要内容,如果未能解决你的问题,请参考以下文章
C++类和对象(构造函数析构函数拷贝构造函数赋值运算符重载Const成员)详细解读
C++类和对象(构造函数析构函数拷贝构造函数赋值运算符重载Const成员)详细解读
c++类大四个默认函数-构造函数 析构函数 拷贝构造函数 赋值构造函数
C++初阶:类和对象(中篇)构造函数 | 析构函数 | 拷贝构造函数 | 赋值运算符重载