
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
c++编程开发语言随着互联网的不断发展而被越来越多的程序员掌握,今天我们就通过案例分析来简单了解一下,c++编程数据复制与转移方法分享。
1、数据拷贝
数据创建之后,不仅可以供成员函数使用,还可能被转移到其他对象中去。或者和其他对象共享。复制构造函数可以控制数据以怎样的方式和其他对象共享。
复制构造函数有以下几个特征
会出现至少两个同类型的对象。因为复制需要先有一个存在的对象,再用这个存在的对象数据初始化另一个正在创建的对象的成员变量。这也是复制构造函数参数是自己的原因。
存在变量从无到有初始化的情况都会调用复制构造函数。函数调用,形参需要初始化为实参,参数本来不存在,调用函数会传递一个已存在的对象,就会调用到复制构造函数。这也是为什么复制构造函数参数是引用的类型。假如是普通变量,调用复制构造的时候需要产生临时变量,临时变量又需要调用复制构造函数,程序就会陷入无限递归中。
除了函数调用,函数返回值,用对象初始化新变量的情况也会调用到复制构造函数。函数返回后,函数体中所有的局部变量都会被销毁,返回值也属于一种局部变量肯定也要被销毁,但是返回后的值却需要被外部使用,它们的生命周期是不一样的,由此我们就知道肯定创建了一个新的对象,这个对象被局部返回值初始化,但是有着和外部一样的生命周期。用对象初始化变量就更直观了,初始化的对象是从无到有创建的。符合构造函数出现的特点。
2、左值和右值
说起移动,就不得不提到左值和右值。这里的左和右是相对于=来说的。
我们知道=是用来赋值的,这下面隐藏着三个动作:生,取,写。在内存中生成一个临时数据,读取变量保存位置,将临时变量内容写入保存位置。生就是指的右值,它保存在我们不知道的内存位置,在写动作完成后,它就被回收了。而取对应的就是左值,我们用变量名保存了它的内存位置,在它作用域内可以反复读写。所以右值大的特点就是不知道地址,如i=i+1就会先生成一个i+1的临时对象,我们不知道地址,所以它是右值。与之相对的左值,是可以通过&读到地址的。
接下来我们再来谈一谈引用。我们通常是用别名来理解引用的,但是可能会忽略一个小细节,别名也是需要有归属的,也就是它代表的地址在哪里。基于这个前提,我们就可以推导出凡是存在内存中的数据,理都是有地址的,而右值是存在内存中的,它也应该需要一种方式来获得地址,称之为右值引用,相对的一般变量的引用就称为左值引用。
说回到移动,前面的复制构造函数虽然能将数据和其他对象共享,但是大部分情况下,数据其实不需要共享的,只需要转移,也就是将数据的所有权移动到另一个对象上,原始对象就不再有效。所以C++提供了移动构造函数来完成这个操作。
3、数据共享
除了通过复制构造函数和成员函数共享数据外,还可以通过友元类和友元函数。它们都是一种特殊的访问数据的形式,可以直接访问到数据,不经过成员函数的调用。所以在有些时候友元能帮助减少函数调用的花销,有些时候则会引入不可预期的行为。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。