当前位置:  开发笔记 > 编程语言 > 正文

构造函数的初始化列表中的'this'指针

如何解决《构造函数的初始化列表中的'this'指针》经验,为你挑选了2个好方法。

我想我无法理解为什么这不起作用.我一直以为我可以在构造函数中使用'this'指针,但我从来不知道我不能在初始化列表中使用'this'.

#include 

class A {
    public:
        int a;
        int b;
        A(int a = 0, int b = 0) : this->a(a), this->b(b) { }
        void print() {
        std::cout << a << ", " << b << std::endl;
    }
};

int main() {
    A a;
    a.print();
}

我很想知道与之相关的细节.



1> Sombrero Chi..:

仅仅因为没有必要,初始化列表已经可以消除歧义,因为它的语法是严格的:

member(value)

所以你可以把它改成:

A(int a = 0, int b = 0) : a(a), b(b) {}

this->member 只有当程序员需要帮助编译器消除歧义时才会真正使用它,例如,如果你的构造函数看起来像:

A(int a = 0, int b = 0) 
{ 
  // set local 'a' to itself
  a = a; 
}

A::a现在不会被初始化,哎呀!

您需要this帮助编译器:

A(int a = 0, int b = 0) 
{ 
  this->a = a; // set A::a to local a.
}


@KonstantinĐ.:请注意,Google C++样式指南在C++程序员中并不受到广泛尊重,不应被视为C++社区推荐的代表.

2> Potatoswatte..:

this->a 语法无效,因为它是一个成员访问表达式,但在那里只允许一个标识符(或类型说明符,对于基类).

从C++标准,[class.base.init],

mem-initializer-id:
      class-or-decltype
      标识符


是的,"为什么"是......因为完全没有必要使语法复杂化以允许添加`this->`.事实上,你必须回溯一堆"......形成不良"的规则,基本上禁止你刚添加的任何东西_但是添加了`this->`.
推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有