关于类的构造函数

构造与析构函数

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值