C++ 类与对象 2

默认成员函数

当我们定义一个类对象的时候即使我们在类中没有定义任何东西还是会默认生成6个默认成员函数这些都是编译器默认生成的,所以仅含这6个默认成员函数的类也称为空类。

构造函数

构造函数是特殊的成员函数,可以由程序员实现,当没有实现任何构造函数的时候编译器会自动生成一个,这个函数一般都用于对函数内的数据进行初始化。

与一般的函数不同,构造函数并没有返回值,且构造函数必须与类名相同,除此外与一般函数并不二至。一般构造函数用于对类对象的初始化。

Add(int a, int b)就是一个构造函数,它负责当我们创建对象的时候对成员数据_a,_b进行赋值,构造函数是当我们创建对象的时候由编译器自动调用的,若是当我们创建对象时没有构造函数则会报错。

这里我们在创建对象同时传了2,3作为构造函数的形参但是若我们传的形参与构造函数的形参不匹配便无法生成对象。

若我们没有实现构造函数,编译器会自动生成一个默认构造函数,默认构造函数是指这个构造函数是无参的或者是参数是全缺省值的构造函数。编译器生成的就是 一个无参的默认构造函数,这个构造函数不会对内置类型(int,char等)做任何动作,若是自定义的类型如其他的类或结构体则会调用自定义类型的构造函数。但是当我们生成了任何一个构造函数之后编译器都不会生成默认构造函数,但是也可以强制让编译器生成:

不过这个关键字是C++11之后才支持的,若是用的旧版本的话只能自己手动实现了。默认构造函数是只能有一个的,若是一个全缺省和无参的同时存在构造无参的时候便会紊乱让编译器不知道调用哪个,一般最好是设置一个全缺省的默认构造函数比较好。

拷贝构造函数

拷贝构造函数也是一种构造函数,当我们自行实现了的话编译器自动生成的默认构造函数和拷贝构造函数都不会自动生成需要注意。

拷贝构造函数一般是实现出来用于对象的拷贝的

比如这里我们需要使用之前创建好的对象N来创建一个新的对象M这里就可以调用我们写的构造函数,将N对象的值赋给M对象。这里拷贝构造函数的参数只能是这个类对象的引用且不能有其他参数this除外。编译器生成的默认拷贝构造函数与这个类似,对内置类型会完成值拷贝,对自定义的类型就会调用它自己的拷贝构造函数,注意内置类型是完成值拷贝,若你的成员变量是个指针是赋值指针的值不是指针指向的值所以默认的只是浅拷贝,若是需要深拷贝是需要自己实现的。特别当我们需要开辟新空间的时候是一定要自己实现拷贝构造函数的。

当我们有函数的返回值类型为类对象时返回是需要调用拷贝构造函数的。

析构函数

析构函数一般我们是用于对函数内部资源进行释放的,默认的析构函数也是对内置的类型不做处理,对自定义类型调用它的析构函数,需要对资源进行释放的一般是进程资源或者是我们堆上的资源这些在出了作用域之后依然存在的资源才需要主动对其进行释放,所以一般若是没有此类的资源析构函数就不需要手动实现直接使用默认的就可以,当然若是类中申请的堆上或进程等资源我们是手动实现了,析构与构造相反是在对象生命周期结束时自动调用,所以,只要我们将析构实现好了,这个资源就不需要再操心了,等对象生命周期结束自己调用析构函数就可以了。

析构函数也是一个很特殊的成员函数,其函数名也是类名并且没有返回值,为了与构造函数做区分在函数名前加'~'符号

与构造不同的是构造是可以有参数的,析构函数是不能有参数的。析构一般都是在生命周期结束时自动调用并不会传参数过去的,一些特殊情况需要显示调用的除外。析构函数是不能重载的当我们手动实现了之后编译器就不会生成了,这是由于编译器对析构函数的名字生成导致不会的,虽然我们在实现是是加上~符的,在编译时就将将这个改了根据不同的编译器可能会有不同的名字区别但是其实若我们写了两个析构函数,在编译后两个函数的名字是不一样的编译之后转成汇编码之后是不存在这个字符的,也就无法完成函数的重载。

赋值运算符重载

类对象是属于自定义类型,赋值运算符只能完成内置类型的赋值,自定义类型的赋值又是一个常用的运算所以C++类中便默认生成一个赋值运算符的重载版本让对类的使用更加方便。

默认的赋值运算符重载会对内置类型完成赋值也是值拷贝,对自定义类型会调用它的赋值运算符重载

赋值运算符重载一般参数和返回值都是使用类类型的引用以提高效率。平时我们使用的赋值运算符是支持连续赋值的,这是因为连续的赋值运算从右向左,完成赋值后会返回赋值的值所以可以接上下一个赋值,这里也是一样所以这样设计类也可以完成连续的赋值。

因为每个类都会生成一个默认的赋值运算符重载,所以我们在自己实现的时候只能在类内完成,不能重载成全局函数,会与内部赋值运算符重载冲突。

与上述的默认成员函数一样当本次赋值涉及到资源管理的时候也是必须自己实现的。

自加运算符重载

自加自减运算符与一般的运算不同,在变量的前与后所代表的操作和值不同,所以重载这两个运算符时相较与一般运算符重载有一定的改变:前置++的格式与一般运算符重载的是一样的,后置++则增加一个整形参数代表是后置的++;

&与const&运算符重载

这个正常都不要自己实现,直接使用编译器默认生成的就可以了,这个两个函数就是返回了this指针的值。

const成员函数

对成员函数用const修饰符修饰后此函数便成为了const成员函数,这里实际上是将this指针设置为了const指针了,此成员函数不能调用非const成员函数,当我们在外部创建了一个const对象此对象只能调用const成员函数,不能调用非const成员函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值