构造与析构函数
好久没有写博客了….趁着正在学习c++把博客捡起来.
嗯….本次是关于构造函数和析构函数的笔记
引入:对对象在构建的时候对其进行初始化.
- 可以自己写一个函数对所有数据进行初始化
class Frist
{
int a;
public://手动写一个初始化函数
void init(int d=5)//这里用了缺省值,如果调用时写了(传入)该参数,则d的值为该参数,没写就默认为5.
{
a=d;
}
};
int main()
{
Frist one,two;
one.init();//没有d默认为5
two.init(2); //有d为2
}
这样自己定义有点小瞧c++了,在c++中有更好的方法来初始化对象.
- 构造函数
其实,c++在构造对象时,首先会进行一个特有的构造函数.
首先进行:即是一定会首先自动调用这个函数(该函数一般用来初始化,但语句你可以自己写)
特有的:每构造一个对象就会调用一次,且只会调用一次,以后就不用了.
构造函数特点:
1.不定义返回值:不能定义返回值,void也不能有,但其实他的返回值是构造好的该对象
2.名字与类名相同.
class Frist
{
int a;
Frist()//构造函数,也可以在类外定义
{
a=0;
}
};
int main()
{
Frist one;//隐式
Frist two=Frist();//显式
//one.Frist;//构造函数是创建对象的,对象没构建就无法通过对象调用,构建好了就不需要在次调用,所以通过对象调用构造函数是错误的.
}
- 构造函数的重载
构造函数也可以重载
函数重载:函数名字一样,其他的都可以不同,但是通过参数列表(参数个数,参数类型)来区分不同函数.调用时系统会根据传入的参数来选择相应的函数.
class Frist
{
int a,b,c;
Frist()
{
a=0;b=0;c=0;
}
Frist(int x)
{
a=x;b=0;c=0;
}
};
Frist::Frist(int x,int y,int z=0)//类外定义
{
a=x;b=y;c=z;
}
int main()
{
Frist a1;
Frist a2(1);
Frist a3(1,4,5);
Frist a5(1,3);
}
- 默认构造函数
1.之前说,构造函数一定会自动执行,且只执行一次,那如果我不写构造函数他怎么执行,执行什么代码.答案是,如果自己不写构造函数,c++会自动给你添加一个默认构造函数型如Frist(){} 他这个函数什么都不会做,(不会对构造的对象进行初始化)只为满足执行且执行一次的准则.
2.如果自己写了哪怕是一个构造函数,c++就不会自动添加默认构造函数.
3.自己写的默认构造函数不能有两个以上,否则函数在调用时就不知道是调用没有参数的那个函数,还是调用参数全为默认值的缺省值的那个函数,具有二义性(函数的重载也会有相同的问题)
{系统自己默认添加型如Frist(){}
默认构造函数
{程序员自己添加的 {无参数 Frist(){....}
{参数全为缺省值Frist(int a=0,int b=4){....}
4.调用默认构造函数时不能在后面加括号
Frist a1(1,2);//有参数的构建对象
Frist a1;//不写参数构建对象就不能加括号
Frist a1();//加了括号编译会通过,但是会认为这是在声明函数.(该函数返回值是Frist类,函数名为a1,参数为空),这种错误非常危险.
- 构造函数对于类型转换的作用
构造函数作用
1.构造对象;
2.对对象初始化;
3.用于类型转化;
class Frist
{
int a,a2;
Frist(int b)
{
a=b;
}
Frist(int b,int b2)
{
a=b;
a2=b2;
}
};
int main()
{
Frist one(0);
one=100;//这里的赋值可以成功,并且这个值赋给了a;
one={100,114};//将一组数据,通过构造函数,构造出一个临时对象,再将其赋值给one
}
这里的赋值是有一点隐式转化的意思,通过构造函数(传入对应参数)进行构造一个临时的对象,然后就把临时对象的内容赋值给一遍要赋值的对象.
所以在调试时你会发现他调用了一次构造函数,这里就像是使用构造函数进行了隐式转化.
有时候我们会看到构造函数前面加了关键字
explic Frist(int b)
{....}
这意思是显式转化,即当我们再使用上面的操作的时候就要显式的强制转化就可以了.
one=(Frist)100;
既然不同类型可以转换为对象,那能不能用对象转化为其他类型呢?
int a=one;//单纯的这样的一条语句是不对的,不可以的
那我们可以写一个函数,把对象中数据作为int型返回出来.
但是这在本质上和上面的类型转化不同,c++中有骚操作,可以用运算符重载.和构造函数没关系了,以后学了再说….
- 析构函数
对象周期结束后会调用析构函数,对对象进行释放
该函数与构造函数很像
1.不能定义返回值,不能定义参数,也就意味着没有重构,如果不写系统也会自己加一个默认的.
2.名字与类名相同.前面加一个取反符号.~Frist(){…..};
3.构造的对象存储在栈区,所以一起退出作用于的时候析构的顺序是先构造的后析构.
学习笔记,有错误或者用词不当的地方,欢迎大佬评论指出.