【问题标题】:Constructor and "this" pointer构造函数和“this”指针
【发布时间】:2016-09-11 11:41:05
【问题描述】:

我开始学习 c++,并在教程中找到了下面的课程。我的问题与构造函数有关。 班级是:

class point{
private:
    double *x;
    double *y;
public:
    point(double x=1,double y=1);
    //....
};

而构造函数是:

point::point(double x,double y)
{
    this->x = new double;
    *(this->x)=x;
    this->y = new double;
    *(this->y)=y;

    }

我想问为什么下面的代码是错误的?为什么我必须使用“this”?

 point::point(double x,double y)
    {
        x = new double;
        *x=x;
        y = new double;
        *y=y;

    }

【问题讨论】:

  • 请将该教程扔进垃圾箱。
  • 因为当您引用x 时,编译器认为您引用的是参数变量x 而不是类变量x。并且由于参数变量x 不是指针,因此会引发编译错误
  • 这个例子非常愚蠢。 1)因为变量名xy(成员和参数)重复; 2) 因为x 没有定义为double,而是指向double 的指针。可能是为了举例,但要注意这些注意事项。

标签: c++ pointers this


【解决方案1】:

您的编译器如何知道x 参数和x 类字段之间的区别?

this->x 表示属于我所在类的x 变量,即:point

如果你在_x类中调用了字段x,你可以在构造函数中写*_x = x

PS:是的,同意 cmets,这不是一个好的教程 x)

欲了解更多信息:http://en.cppreference.com/w/cpp/language/this

【讨论】:

  • 我不认为句子“this->x 表示属于我所在范围的 x 变量,即:点类”使用了正确的术语。 this 不是关于范围,而是关于使用当前对象成员而不是使用当前范围(函数,它将找到函数参数x)。
  • 是的,抱歉,我正在寻找一种正确表达它的方法。
  • 坏习惯 x) 不知道从何而来
【解决方案2】:

只是想在 Naliwe 的答案中添加一些额外的信息,
你可以像这样构造构造函数:

 point::point(double x,double y) : 
              x(new double(x)), 
              y(new double(y))
 {
 }

在这种情况下,编译器理解哪个名称指的是哪个“事物”——例如第一个 x 用于类字段,第二个用于构造函数参数。

【讨论】:

  • 谢谢,我犹豫了,因为它涉及其他概念,例如使用构造函数列表,您的字段不会被初始化“两次”,即默认构造然后初始化为您想要的任何内容:) 虽然在这种特殊情况下,他使用指针
  • 这是首选的 C++ 方式。但是,在此特定代码中,存在可能导致内存泄漏和/或程序崩溃的错误。在 C++11 中,您应该使用智能指针,但稍后您将学习它们。
【解决方案3】:

也许您可以尝试使用范围限定符:

point::point( double x, double y ) {
   point::x = new double;
   *point::x = x;
   point::y = new double;
   *point::y = y;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    相关资源
    最近更新 更多