在构造函数上的单个参数时隐藏参数

时间:2013-08-21 01:25:38

标签: c++ constructor shadow

您好,我正在编写简单的类,然后是Web中的示例代码。 此代码工作正常,没有错误。

class Shape{
      protected:
              int width,height;

      public:
             Shape(int a = 0, int b=0)
             {
             width = a;
             height = b;         
                       }

};
class regSquare: public Shape{
      public:
             regSquare( int a=0, int b=0)
             {
              Shape(a, b);
             }    
};

但是当我改变我的只有一个构造函数的参数,如

class Shape{
      protected:
              int width;
      public:
             Shape(int a = 0)
             {
             width = a;

                       }

};
class regSquare: public Shape{
      public:
             regSquare(int a = 0)
             {
              Shape(a);
             }    
};

这种按摩发生错误

  

'错误:声明'a'遮蔽参数'

我不知道我的代码有什么问题

2 个答案:

答案 0 :(得分:6)

尽管如此,很可能两个版本都没有你想要的版本!代码

regSquare(int a = 0, int b = 0) {
    Shape(a, b);
}

初始化Shape对象的regSquare子对象!相反,它会创建一个Shape类型的临时对象,其参数为ab。一个参数版本做了类似的事情:

Shape(a);

定义名为Shape的{​​{1}}类型的默认构造对象。您可能打算使用初始化列表将构造函数参数传递给a子对象,例如:

Shape

reqSquare(int a = 0, int b = 0)
    : Shape(a, b) {
}

答案 1 :(得分:0)

因为在单项争论中,编译器将其用作对象名称并创建对象,因此会产生冲突。