首页 > 编程 > C++ > 正文

C++如何设计一个不含指针的类 (Boolan笔记第一周)

2019-11-11 07:36:06
字体:
来源:转载
供稿:网友

C++设计一个不含指针的类还是比较简单的,因为它不需要考虑一下三大因素(也叫Big Three): destructor copy constructor copy assignment Operator 为什么呢?因为不含指针的话,浅拷贝(memberwise copy)就可以了,不会涉及到同一块内存被多个对象指向的问题,析构的时候也不需要考虑内存的操作。

举例complex类如下: *class complex //class head { //class body public: complex (double r = 0, double i = 0): re (r), im (i) { } complex& operator += (const complex&); double real () const { return re; } double imag () const { return im; } PRivate: double re, im; friend complex& __doapl (complex *, const complex&); };*

这里有几个需要注意的地方: 1) real()和imag()在类的体内定义,则自动成为inline函数。如果在体外定义,则需要显式声明inline才会成为inline函数。

2) friend函数本身不是类的一部分,friend是指此函数可以自由访问该类的private成员。friend也可以用在类上面,一个类的friend类的object可以访问该类的private成员。注意: 同一个类的各个object互为friend,这也是为什么拷贝构造函数和赋值构造函数可以实现的基础。

friend函数有什么好处呢?因为friend函数不需要通过class来访问,比用class函数来做效率更高。

3) complex定义了自己的缺省构造函数。 complex (double r = 0, double i = 0): re (r), im (i) { } 所谓缺省构造函数是指对象的创建不需要参数就可调用的构造函数。C++标准规定,如果构造函数没有参数,或者构造函数的所有参数都有缺省值,则算作缺省构造函数。

如果complex没有定义自己的缺省构造函数,C++编译器会自动给它生成一个缺省构造函数类似, complex() {} 注意该函数什么也不做。

如果complex的缺省构造函数为complex(double r=0, double i=0): re(r), im(i) {},并且没有其他缺省构造函数,代码 complex c1; 会调用该构造函数,并用re和im的缺省参数。

如果complex的构造函数为complex(double r, double i): re(r), im(i) {}, 并且没有其他缺省构造函数,代码 complex c1; 会编译出错,因为编译器不知道把什么值赋给re和im。

如果complex的缺省构造函数为complex() {}, 并且没有其他缺省构造函数,代码 complex c1; 会调用该缺省构造函数。

如果complex 有两个缺省构造函数, complex() {} complex(double r=0, double i=0): re(r), im(i) {} 代码complex c1编译会出错,因为编译器不知道调用那个缺省构造函数。

如果complex有以下两个构造函数,注意第一个为缺省构造函数,第二个不是。它们可以共存。 complex() {} complex(double r, double i): re(r), im(i) {} 代码complex c1;编译会通过,编译器会采用complex() {}作为缺省构造函数。

4) 下面几种写法要特别注意它们的区别: complex c1(): 声明一个名为c1的函数, 该函数返回complex类型。注意这里不是创建complex 类的对象 complex c1; //创建一个complex的一个名为c1的obj, 并且会调用complex 类中的缺省构造函数,其缺省参数为(0,0). complex(); //创建一个complex的临时对象,此处会调用complex 类中的缺省构造函数,同样,int()也是创建一个int的临时对象 complex c1=complex(); //创建一个complex的临时对象,并赋给c1,此处会调用赋值构造函数 complex *p=new complex();//创建一个complex的obj,这里会调用complex类中的缺省构造函数,并用指针p指向它。

5) complex重载了+=操作符。操作符重载可以看成是一个特殊的函数,给C++编程带来很大便利。

操作符重载可以是类成员函数,也可以是非类成员函数。如果是object自身与complex的其它object相加,可写成类成员函数,如上面的这种情况; 但如果不是object自身与complex其他object相加,则不能写成类成员函数。

如果是成员函数的话,默认第一个参数是this指针,通常不写。注意:操作符重载一定是作用在左边的操作符。

6) 上面operator+重载函数参数采用传引用。 对于函数入口参数,尽量用传引用,因为传值的话,value会放进stack,应该尽量少用。 另外,对于函数返回值也是尽量返回reference,但如果函数返回的是在栈上分配的一个local变量或object,则不能返回reference,因为该local变量或obj已经被删除。

7) 上面operator+的入口参数加了const。对于函数入口参数,如果函数不会改变这个参数,则该参数可以加const。 另外,如果某类函数不会改变函数的数据成员,则可以在函数名后加const,比如上面的real()和imag()函数。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选