C++中的构造函数

C++中的构造函数

需求: 每当我定义一个新的对象,我都希望对象中 成员被初始化一次.
1) 自己写函数init----初始化函数
2) 类/对象 提供了一个 专门的函数 来完成对象的初始化.
称为----构造函数, 构建制造—对象产生的时候,对对象中的成员进行初始化

和类名一致,没有返回值-不是void,  	用于和普通函数区分
当对象被构成/产生的时候,函数自动执行--系统调用的
构造可以有多个---函数重载		还可以有默认值
注:当你不写构造,编译器帮你指定一个 默认构造 
#include<iostream>
using namespace std;


class student{
public:
	string name;
	string sex;
	int age;
	double weight;
	
	void show() 
	{
		cout<<"name="<<name<<" sex="<<sex<<" age="<<age<<" weight="<<weight<<endl;
	}
	
	
	student(): name("noname"),sex("man"),age(1),weight(0.1)   //函数 参数初始化列表
	{  
		//等同于  name="noname";sex="man";age=0;weight=0.1;   
	}
	/*
		初始化列表:
		1.只有构造函数可以,紧跟函数名后面   fun() : 变量名(值),变量名(值)..
		2.初始化列表先于{}执行.
	*/
	student(string xname,string xsex,int xage):  name( xname),sex(xsex),age(xage)
	{
		//等同于 
		//name=xname;
		//sex=xsex;age=xage;
	}
	
};


int main()
{
	student xiaohua;
	xiaohua.show();
	
	student dahua   ( "dahua","man",3);
	dahua.show();
}

特殊的构造函数: 拷贝构造函数


#include<iostream>
#include <cstring>

using namespace std;


class student {
public:
	string name;
	string sex;
	int age;
	char *desbuf;
	
	student() { name="noname";sex="unkown";age=0;desbuf=new char[32];  }
	student(string xname,string xsex,int xage)
		{ name=xname; sex=xsex; age=xage; desbuf=new char[32];}
	student(string xname,string xsex,int xage,char *des)
		{ name=xname; sex=xsex; age=xage; desbuf=new char[32];strcpy(desbuf,des);}
		
	//拷贝构造函数,   参数是另一个对象,触发条件使用旧对象初始化新对象
	student( student &oldobj) {  cout<<"in copy structure"<<endl; 
			name="noname"; sex=oldobj.sex;age=oldobj.age;
			desbuf=new char[32]; strcpy(desbuf,oldobj.desbuf);
		}
	
	
	void show(){ cout<<"name="<<name<<" sex="<<sex<<" age="<<age<<" des:"<<desbuf<<endl;}
};

int main()
{
	
	student xiaohuang  ("xiaohuang","man",3,"des,universtyStudent");
	
	//student xiaowang =  xiaohuang;		//使用另外一个对象来初始化 新对象,效果等同于下一行
	student xiaowang     (xiaohuang);
	
	/* 他调用的是 拷贝构造函数 
		student xiaowang =  xiaohuang;   ---g++翻译为-->    student xiaowang      (student &obj);
		如果你不写,系统帮你制定一个,   这个函数使用简单的覆盖机制		-----浅拷贝
		这种 简单拷贝方法,有问题:


		strcpy(xiaowang.desbuf,",universtyStudent");
		xiaohuang.show();
		xiaowang.show();		发现两个对象使用的 同一片空间,不行
		
		我们要重写############################## 完成自己的拷贝			-----深拷贝
	*/
	
	xiaowang.name="xiaowang";
	strcpy(xiaowang.desbuf,"universtyStudent");
	xiaohuang.show();
	
}

析构: 只要对象消失,就执行析构函数 注:只有一个,用来释放空间的

#include <iostream>
#include <unistd.h>

using namespace std;

class student {
public:
	//静态的成员
	string name;
	string sex;
	int age;
	char*buf;
	
	/*构造函数		对成员进行初始化
		1.和类名一致,没有返回值-不是void,  	用于和普通函数区分
		2.当对象被构成/产生的时候,函数自动执行--系统调用的
		3.构造可以有多个---函数重载		还可以有默认值
		
		当你不写构造,编译器帮你指定一个 默认构造    student(){ 啥都不干 }
	*/
	student() {cout<<"in structure student()"<<endl; name="huahua";sex="woman";age=1;   buf=new char [128]; }  //默认构造
	student(string xname,string xsex) {cout<<"in structure student(xname,xsex)"<<endl;name=xname;sex=xsex; buf=new char [128];};
	student(string xname,string xsex,int xage  ){cout<<"in structure student(xname,xsex,xage)"<<endl;name=xname;sex=xsex; age=xage; \
		buf=new char [128];} 
	
	//void deinit() {delete []buf;} 
	/*
		析构:  当对象消失的时候,自动调用,用来释放一些空间
					1) delete p;   2)main函数退出--所有对象都析构  3)局部对象释放

			1.析构函数没有返回值,和类名一致,前面加了~
			2.析构函数只有一个
	*/
	~student() { delete []buf;  cout<<"in ~student();"<<"name="<<name<<endl; };

	//动态的方法
	void show(void){cout<<"name="<<name<<" sex="<<sex<<" age="<<age<<endl;}
	//void init(string name,string sex .....)
};

void do_show(void)
{
	student xiaohuang ("huang","man");		//当函数退出的时候,析构被执行
}

int main()
{
	student xiaohuang;		//注意,当对象产生,系统帮你自动调用构造函数, 默认构造 
	student xiaowang         ("wang","man");
	student xiaozhang         ("zhang","woman",9);
 
	//指针访问
	student *pt =   &xiaohuang;
	pt->show();		//效果等于 xiaohuang.show();  
 
	cout<<"##########new obj ###########"<<endl;
 	//######### new object-对象 ################
	student *pt0 =  new student ;  pt0->show(); // malloc(sizeof(struct student));  默认构造
	student *pt1 =  new student   ("xiaohuang1","woman") ;    //指定构造
	student *pt2 =  new student   ("xiaohuang2","man", 3);
	
 	delete pt0;		// 释放整个对象      但是如果对象指针指向的空间,没有释放
	delete pt1;		// 一般在delete之前释放
	delete pt2;
	
	
	do_show();
	
	while(1){  sleep(1); };
	
	return 0;
}
  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小镇春风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值