模板类之(数组)

来源:互联网 发布:数据决策系统 编辑:程序博客网 时间:2024/06/06 23:50

一、数组类

//shuzu.h

 

二、应该要注意的几个问题:

1、为什么拷贝构造函数要这么复杂?为什么不是简单的赋值?

——这涉及到深拷贝和浅拷贝的问题。简单的对对象成员赋值只能实现浅拷贝,浅拷贝会造成内存访问的安全性问题(同一块内存被释放两次)

 

2、为什么有些函数返回值是对象的引用,改为返回对象值可以吗?

——如果一个函数的返回值是一个对象值,它被认为是一个常量,当然不能成为左值。如果返回引用,引用的实质就是变量(对象)的别名,通过变量(对象)的别名当然可以改变变量(对象)的值。

eg:int a,b = 5;

(a=b)++;

这在C++中是允许的,运行后a的值是6,因此运算符“[ ]”和运算符“=”返回的都是引用类型。

另外,C++语法还规定,“=”,“[ ]”,“->”,“( )”都只能重载为成员函数,而且“=”运算符函数是不能被继承的。

所以重载运算符[]和运算符=都返回引用。

 

3、重载指针运算有必要吗?

看一个程序:

 

这里函数read的第一个形参是int *类型,而数组名a也是一个int型的指针常量,类型恰好是匹配的。但是如果希望像使用普通数组一样使用Array类的对象,将上述main函数改为如下:

 

 

这里形参和实参不同,编译系统会尝试进行自动类型转化,将类对象名a转换成形参的int*。由于a是自定义的对象,因此无法实现这一转换,因此需要我们自行编写重载的指针类型转换函数。

 

4、为什么转换指针函数体内有return语句,但是函数却没有返回值,连void都没有?

——这是C++语法规定:重载类型转换运算符时,不允许指定返回值类型(也不要写void)

 


 

三、应用上面的Array类:

求范围在2~n之间的质数,n在程序运行时由键盘输入

 

 

原创粉丝点击