一、数组类
//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在程序运行时由键盘输入