2016-06-12 39 views
0

我是新来的c + +,我正在练习自己的类和对象。我做了一个包含运算符重载的程序,它有一个“显式构造函数”。我用很多不同的值试过它,它工作正常,但我的显式构造函数与老师的答案有点不同。 老师的回答是:显式构造函数的特殊操作符C++

class Ventilator { 
int maxrot; 
int rot; 
int vert; 
bool horiz; 
public: 
explicit Ventilator(int maxrot=500, int rot=0, int vert=0, int horiz=false): maxrot(abs(maxrot)), 
    rot(rot<0?0:rot>abs(maxrot)?abs(maxrot):rot), vert(vert<-15||vert>15?0:vert), 
    horiz(horiz) { } 

我的是:

class Ventillator{ 
int rotation; 
int vertikal; 
int maxrot; 
int horiz; 
public: 
explicit Ventillator(int rotation = 10, int maxrot=100, int vertikal = 11, bool horiz = true): 
    rotation(abs(rotation)), maxrot(abs(maxrot)), vertikal(abs(vertikal)), horiz(horiz){ 

    if (this->rotation > this->maxrot) this->rotation=this->maxrot; 
    if (this->rotation < 0) this->rotation = 0; 
    if (this->vertikal <= 15 && this->vertikal >=-15) this->vertikal=vertikal; 
    else 
     this->vertikal = 0; 
    } 

不都的方式不太一样?他不是只使用特殊的操作符来使代码更紧凑吗?

+0

教师的代码允许'vert' '-5',但是你会将它转换为'+ 5'。 – aschepler

+0

@aschepler我用-5试了一下,但它也能工作。 – specbk

回答

2

这两个例子在这种情况下达到相同的效果。使用初始化列表仅是(我认为)一般更优雅,因为

  • 这意味着该成员可为常量
  • 的成员立刻初始化为正确的值。如果另一个成员初始值设定项或构造函数体可以抛出,这可能很重要。

不过,我认为有两个三元运算符(:)表达式可能难以阅读 - ?我可能会写了一个辅助函数返回与初始化rotation值。

+0

我想我明白了,非常感谢! – specbk

+0

三元运算符特别难以阅读,当你格式化它们就像你的空格键坏了!明智地使用空格是至关重要的。但我完全同意你写关于辅助函数的意见。我经常在自己的代码中这样做,但我一直对此有所怀疑,因为我很少在其他人的代码中看到它。 –

1

不,有一些区别,只是意识形态。 您的解决方案是更好,因为它更具有可读性,你可以教你的老师怎么写出漂亮的代码:)

而且,你重写代码:

#include <algorithm> 
class Ventillator 
{ 
    int rotation; 
    int vertikal; 
    int maxrot; 
    int horiz; 
    inline int place_in_range(int num, int max, int min) 
    { 
     return ((std::max) (((std::min)(max, num)), min)); 
    } 
    inline bool is_in_range(int num, int max, int min) 
    { 
     return num <= max && min >= num; 
    } 

public: 
    explicit Ventillator(int rotation = 10, int maxrot=100, int vertikal = 11, bool horiz = true): 
     rotation(place_in_range(abs(rotation), maxrot, 0)), maxrot(abs(maxrot)), vertikal((is_in_range(vertikal, 15, -15) ? abs(vertical) : 0)), horiz(horiz) 
    { 
    } 
}; 
+0

谢谢!我会试试看!我以为我错了,我很高兴听到它不是:)) – specbk