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;
}