关于类的构造函数

来源:互联网 发布:淘宝店铺轮播图片制作 编辑:程序博客网 时间:2024/06/08 03:20

构造与析构函数

好久没有写博客了….趁着正在学习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.构造的对象存储在栈区,所以一起退出作用于的时候析构的顺序是先构造的后析构.

学习笔记,有错误或者用词不当的地方,欢迎大佬评论指出.

原创粉丝点击