一段代码引发的思考-----(类及操作符重载,数组相加)

来源:互联网 发布:图腾9u网络机柜 编辑:程序博客网 时间:2024/05/29 17:02

平时照着书上敲代码,没有发现什么错误,最多是自己失误把字母敲错了,可是轮到自己写代码时,出现了一大堆错误,错误五花八门,但是主要还是对知识概念不熟造成的,学习编程语言的时候还是要多做练习,光敲书上的例子是得不到多大进步的。


这个代码是定义一个重载函数,重载‘+’,使其完成数组相加的功能,最后返回结果。

#include <iostream>class test  //类名{private:int m[2];public:test();   //构造函数test(int c[]);test operator+(const test & t)const; //重载操作符‘+’void Show1() const;    //显示结果};test::test(){m[0] = 0;m[1] = 0;}test::test(int c[]){int i;for(i = 0; i < 2; i++){m[i] = c[i];}}test test::operator +(const test & t)const  //重载操作符'+'{test sum;sum.m[0] = m[0] + t.m[0];sum.m[1] = m[1] + t.m[1];return sum;}void test::Show1()const{std::cout << "array = " << m[0] + m[1] <<std::endl;}int main(){int ar0[2] = {1, 2};int ar1[2] = {3, 4};test array0(ar0);test array1(ar1);array0.Show1();array1.Show1();test to;to = array1 + array0;to.Show1();return 0;}

源代码如上,首先定义了一个test类,私有成员是一个长度为2的int数组,公有成员四个,一个是构造函数test(),在这里要注意,构造函数的名称要与类名相同(析构函数是在类名前加一个‘~’符号),它的主要作用是初始化数组,这个从后面的函数定义就可以看出来,将数组初始化成零,test(int c[ ]),构造函数的参数名称不能和类成员名称相同,所以不能使用int m[ ]作为构造函数的形参。

test operator+(const test & t)const为操作符重载函数,其中operator+为函数名,表明重载操作符‘+’,最前面一个test表明函数的返回值为test类,最后面的一个const可以保证重载函数不修改调用它的类,在本例中,可以保证重载函数不修改array1,括号里的const表示test & t在其寿命周期内不能被改变,&t是一个引用,是作为调用函数实参的引用,它的类型是test类。(小提一下const和define的区别,两者都可以定义常量,define只是相当于文本替代,而const定义了常量的类型).

void Show1()const,后面的const同样是为了防止Show1()改变调用对象而设置的。

下面来看一下函数的定义,前面已经说了,第一个构造函数主要是将数组初始化为零;在C++中,有私有成员和公有成员,使用类对象的程序都可以直接访问公有部分,但是只能通过公有成员函数访问私有成员,所以第二个构造函数的作用是将非类成员数据赋给类的私有成员数据。在看重载函数之前,我们看一看主函数中这一段代码:to = array1 + array0;这句话实际上实在调用重载函数,其中array1为调用函数的对象,array0为调用函数的实参,这段代码等价与array1.operator+(array0),函数定义中的sum.m[0] = m[0] + t.m[0]等价于sum.m[0] = this->m[0] + t.m[0],这句代码的意思是将array1和array0数组的第一个元素相加,然后存于test对象sum的数组m[ ] 的第一个元素中,函数定义的最后返回sum。

函数还可以进行进一步扩展,用const int LEN = 2代替直接写出数组长度,数组内容由用户从键盘输入,而不是在程序里预先赋值。


现在发现自己还有很长一条路要走,在这条路上,当你能够用程序将你心中所想轻而易举的表达出来时,你离成功就很近了。