c++string类 构造函数初始化 带参数的构造函数 构造函数的重载与默认值 析构函数一网打尽

C++中的string类(字符串类型)
1.【首先C++搞出string类就是为了方便使用】C和C++的字符串都是由函数实现,区别在于C++是类内进行,C是全局函数进行。
2使用方法与基本数据类型一致(int float double bool char),但是要在头文件加上#include<string>.
3.说到一个类型也顺带提一下类型的本质,它是系统自定义的一个类型(就是系统提前编好一个类类型,里面的成员就是接下来可以方便我们运算的符号比如“=”复制,<<,>>,<=,>=等基本运算符都是系统提前编写好的也就是我们用头文件直接调用)
4.使用过程中,string类使用定义一个变量的时候,变量可以看作是一个数组,可以直接对其中的字符进行直接进行操作eg: string word=“Then”;  word【2】=‘a’;所以在最后的输出时候会变成“Than”。
5.就是回忆一下,字符串之间是如何比较的呢。
比较方式是通过一个一个字符的ASCII值的大小比较,就是第一个与第一个比如果是相同的就下一个字符,如果不相同就可以判断出大小。
为什么要有string类型呢,因为当我们在对字符串进行复制,比较,修改的时候倘若像c语言中使用全局函数进行操作会很繁琐所以就出现了string。

 


对象初始化
我们可以通过类类型的定义后直接对对象进行初始化eg:class a{public: hour; minute;sec;};a a1={14,56,30};
这样的赋值方法与C语言中的结构体类似,但是它局限性大:因为只能对pubilc的数据成员进行初始化赋值,并且会使代码看起来不便,因此我们引入一个构造函数。

 

通过构造函数实现数据成员的初始化
1.首先明白构造函数有什么用,作用就是为了给对象进行初始化。
2.它与其他成员函数有什么区别,首先,体现在函数的调用方式,它是系统直接调用,也就是对象一旦建立它就会直接使用。其次,它不存在返回值其实不用说也能看出,它的作用是对对象赋值并没有进行什么操作。
3.构造函数的机制固定(死板):就是当我们在创建对象的时候必须成功调用一次构造函数,否则系统就不会执行《那就有朋友要说那我不定义构造函数不就不用了吗,其实不然,就算我们没有定义构造函数他也会自己定义一个空的构造函数执行过去》
4.用构造函数可以直接在里面初始化私有成员(那为什么不直接定一个成员函数,直接进行赋值不就好了?其实我们使用构造函数进行初始化可以在我们调用不传参的时候直接简化,并且我们也可以传参进行对初始化的覆盖,所以构造函数存在是可以帮助简化代码的)
5.其实构造函数是可以包含语句的,但是我们又为何尽量不让它进行除了初始化之外的操作呢,就是为了让我们的代码更好读取毕竟它的存在就是为了简化代码,让代码更加清晰,并且能更好的进行维护。
为什么要有构造函数对数据成员进行初始化呢,因为方便我们对私有成员,以及被保护成员

进行初始化赋值。
那么构造函数竟然有参数列表那么就是可以带参数的,那么就可以引申到带参数的构造函数

带参数的构造函数
1.可以采用带参数的构造函数,在调用不同对象的构造函数时,在外面将不同的数据传递给构造函数,以实现对不同对象的初始化。
2.使用方式::eg:构造函数的首部形式:::构造函数名(类型1 形参1,类型2 形参2…)
由于用户是不能调用构造函数的,因此无法采用常规的调用函数的方法给出实参。所以实参是在定义对象时给出的,形式是::类名 对象名(实参1,实参2,…);
Eg
#include<iostream>
Using namespace std;
Class Box
{
Public:
Box(int,int,int);
Int volume();
Private:
Int height;
Int width;
Int length;
};
Box::Box(int h,int w,int len)
{
Height=h;
Width=w;
Length=len;
}
Int Box::volume()
{
Return(height*width*length);
}
Int main()
{Box box1(12,25,30);
Cout<<”The volume of box1 is”<<box.1volume()<<ednl;
Box box2(15,30,21);
Cout<<”The volume of box2 is”<<box2.volume()<<endl;
Return 0;
}
并且构造函数中用参数初始化表对数据成员初始化
我们可以将上面把上面的定义构造函数改成如下:
Eg:Box::Box(int h,int w,int len):height(h),width(w),length(len){}
Eg:类名::构造函数名(【参数表】)[:成员初始化表]
{

【构造函数体】
}
那么为什么要那个构造的函数体呢,因为当你定义数组的时候是不能像这样简化的,就得把这个数组放到构造函数体内。
既然该构造函数存在参数列表,那么也可以与函数中的参数性质相似,那么就存在重载与默认值。
为什么要有构造函数参数列表呢?其实它的存在就是为了简化代码编写以及使代码美观;

 

 

构造函数的重载
1,首先明确什么叫做重载,重载就是通过使用不同实参个数或者数据类型来调用相同的函数名但是函数内部操作不同(函数模板就是只有数据类型不同其他基本相同,函数内部操作相同)。
2,定义及声明:就是在类内声明有区别的构造函数   区别::(数据类型,实参个数,以及俩者都),然后在类外进行构造函数的定义;
3,使用,就是在主函数中进行对象定义,因为构造函数的执行实在对象定义的时候系统自动调用,因此我们只能在定义一个对象的时候使用一次(意思就是每定义一次对象都要使用一次)
注意!!!!当我们在类内有定一个默认值的构造函数,当我们在定义的时候不能这样定义box()相反应该使用box:
4,为什么我们要有构造函数的重载,因为我们可以对一个相近操作的函数名重复使用不会导致难维护以及错乱的事故,当然我们还可以使用不同的数据成员类型,实参个数的不同,可以定义出不同的构造函数进行计算。


默认值构造函数
1.首先明确什么叫做默认值,就是在声明函数时我们直接在形参列表对变量进行赋值(在定义处写不写默认值都是可以的);
2.定义及其声明:在类中进行构造函数的声明中的形参列表给对象进行赋值,在类外进行定义以及在函数体内进行操作;
3.在创建对象的时候进行使用,就是你定义对象的时候就要想好你是否需要自己传参进行覆盖(即使要传也要想好要传哪几个),不需要的时候直接取默认值的话不能有括号();
注意!!!!一个类只能有一个默认构造函数,也就是说,可以不用参数而调用的构造函数只能有一个;(其实想想也是,我们要是定义了俩个有默认值的构造函数,当我们进行调用的时候就不清楚是调用哪个,系统也会直接报错)
4.一个程序中,函数重载与函数默认值只能存在一个,虽然语法上没有说只能使用一个但是当我们同时使用的时候会出现二义性(就是系统不清楚它要调用哪个就会报错)
为什么要有默认值构造函数,因为可以简化我们代码,当我们编写一个程序的时 候我们可以先为我们的对象赋予初值,倘若遇到要使用的刚好可以直接进行创建一个对象

4,进行使用,即使我们没找到需要使用的对象我们也可以进行实参传值进行覆盖。
讲完了构造函数,那就到与其作用相反的析构函数。

 

 

析构函数
1.析构函数和构造函数一样机制固定(死板),当我们在释放对象之前会使用析构函数,即使我们没有定义一个析构函数它也会自己定义一个空的进行到底(但是不是自己定义的析构函数是不会有任何作用的就是一个形式,要想有作用就必须得自己进行定义);
2.由于析构函数没有函数类型,没有函数参数,因此也不会有函数重载以及默认值。
3.一个类可以有多个构造函数,但是析构函数只能存在一个;
4.使用,其实和构造函数的声明相似,就是在类名前面加一个~取反运算符。
5.调用构造函数和调用析构函数的顺序是相反的,构造函数是按先后顺序进行调用,但是析构函数是构造函数的反序因此可记住“先构造后析构,后构造后析构”;
为什么要有析构函数,析构函数就是为了在释放对象的时候进行一些清理空间的作用,但是记住它并不是删除对象只是在释放对象前的清理罢了;

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值