博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
每天一道算法题(3)——含有指针元素的模板类
阅读量:6691 次
发布时间:2019-06-25

本文共 1842 字,大约阅读时间需要 6 分钟。

1.定义

        倘若没有拷贝构造函数,编译器自动生成的构造拷贝函数或者拷贝运算符的重载函数。在编译器生成的缺省的构造拷贝函数和拷贝运算符的重载函数,对指针实行的是按位拷贝,仅仅只是拷贝指针的地址,而不会拷贝指针的内容。因此在执行完前面的代码之后,指针指向同一地址。当A或者B中任意一个结束其生命周期调用析构函数时,程序就会不可避免地崩溃。因此在此种情况中,一般手动定义拷贝构造函数和重载赋值函数。

        还有另外一种解决方法,即为还可以保存究竟有多少个指针指向该数据。只有当没有任何指针指向该数据的时候才可以被删除。这种思路通常被称之为引用计数技术。具体见参考1

#include"iostream"using namespace std;template
class myArray{ T* data; unsigned int size;public: myArray(unsigned int s=0):size(s),data(NULL){ if(s>0) data=new T[size]; } myArray(myArray& temp):size(temp.size),data(NULL){//拷贝构造函数 if(temp.size>0){ data=new T[size]; for(int i=0;i
0){ data=new T[size]; for(int i=0;i
=0&&index < size) return data[index]; } unsigned int getSize() const{ return size; } friend ostream& operator<<( ostream& out,const myArray& m){//重载输出运算符 unsigned int size=m.getSize(); if(size>0) for(int i=0;i

注意:1.任何情况下,data应该有指向,使用delete后,也要使指针置空。         2.友元函数重载无法使用形参私有成员,但是非友元函数却可以。原因见下面         3.使用const&作为“=”重载的返回类型,保证了无法连续赋值,即(A=B)=C或者A=B=C;

2.其它

   2.1输入输出流重载

        friend istream& operator>>(istream& in, F& f){ return in;}   //输入运算符重载标准格式           friend ostream& operator<<(ostream& out, const F&)(return out;)  //输出运算符的标准重载格式.

        为什么必须定义为友元函数。定义为成员函数隐含this指针,那么只有对应的类对象才能调用,但是<<和>>调用的对象肯定只能是cout或者cin,即不能定义为成员函数了。只有定义成友元,才可以将cin,cout作为一个参数传入重载的操作符函数。返回引用便于实现连续输出或者输入。注意>>形参不为const类型。

  2.2拷贝构造函数

       为什么可以直接使用形参的私有成员

         访问限制标识符是针对类作用而不是针对一个类的不同对象,只要同属一个类,则不用区分是公有私有。具体见参考2

       为什么形参规定为引用类型

           1)引用比较高效:
               如果形参是对象类型的,则需要实例化即对整个对象进行拷贝,效率不高,很不划算。如果形参是指针类型的,从编译的角度来看 :程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而引用在符号表上对应的地址值为引用对象的地址值。
           2)形参为对象类型行不通:
              拷贝构造函数也是构造函数。如果形参是对象,在被调用时形参也需要实例化(构造,形参 = 实参 。即调用拷贝构造函数) 。之后调用拷贝构造函数的形参又要实例化,则又调用拷贝构造函数,产生无穷递归。
具体见参考3

      

参考

         1.

         2.

         3.

转载于:https://www.cnblogs.com/engineerLF/p/5393048.html

你可能感兴趣的文章
前端面试的问题汇总-1
查看>>
文本检查点
查看>>
python之断言
查看>>
没有安装或未能初始化关联的源代码管理插件 TFS连不上服务器的处理
查看>>
我的人才管理方式
查看>>
为ASP.NET MVC应用添加自定义路由
查看>>
windows server2008 r2 下启用 sqlserver 2008的远程连接
查看>>
一个极为简单的requirejs实现
查看>>
莫过于无知一点儿
查看>>
多维数组和数组异常
查看>>
C语言中头文件尖括号和引号的区别
查看>>
Python exec 函数
查看>>
ios单例模式(Singleton)
查看>>
Python列表
查看>>
如何打开xip格式的xcode安装包
查看>>
学习:erlang开源项目。
查看>>
ORM : 对象关系映射
查看>>
如何解除改变phpmyadmin数据库导入文件大小限制?
查看>>
android activity生命周期
查看>>
mysql 开发基础系列15 索引的设计和使用
查看>>