C++11的auto关键字是什么意思?/我不理解某个概念

4

好的,这是我的代码:

CShop::~CShop()
{
    TPacketGCShop pack;
    pack.header = HEADER_GC_SHOP;
    pack.subheader  = SHOP_SUBHEADER_GC_END;
    pack.size = sizeof(TPacketGCShop);
    Broadcast(&pack, sizeof(pack));
    GuestMapType::iterator it;
    it = m_map_guest.begin();
    while (it != m_map_guest.end())
    {
        LPCHARACTER ch = it->first;
        ch->SetShop(NULL);
        ++it;
    }
    M2_DELETE(m_pGrid);
}

我有一个GuestMapType::iterator it;和这个it = m_map_guest.begin();

如果我像这样编写函数,是否可以?

CShop::~CShop()
{
    TPacketGCShop pack;
    pack.header = HEADER_GC_SHOP;
    pack.subheader  = SHOP_SUBHEADER_GC_END;
    pack.size = sizeof(TPacketGCShop);
    Broadcast(&pack, sizeof(pack));

    auto it = m_map_guest.begin();
    while (it != m_map_guest.end())
    {
        LPCHARACTER ch = it->first;
        ch->SetShop(NULL);
        ++it;
    }
    M2_DELETE(m_pGrid);
}

我删除了GuestMapType::iterator it;,以简化我的代码。我的问题是,这会影响我的程序吗?有任何风险吗?

1
那很好。 - Some programmer dude
2个回答

5
那是完全没问题的,使用auto声明迭代器,在我看来,有至少两个好处:
1- 一般来说,迭代器类型的名称比较长。你打得越少,出错的机会就越少。这样做还可以使代码更加清晰,因为你隐藏了一个在这种情况下并不重要的实现细节
2- 向前兼容:当你修改代码时,即修改迭代器类型的名称时,你不需要改变使用auto的那些代码。毕竟,你想使用的是那种类型的迭代器,而不是它的名称。

谢谢!C++11太棒了。:)) - Joe.Dc
另一个问题。请问“auto”能够预防内存泄漏吗? - Joe.Dc
@Joe.Dc 不,它没有。如果你想要防止内存泄漏,学习一下RAII和智能指针。你也可以看一下C++核心准则,这是由Stroustrup、Sutter等人发起的一个全新项目,旨在改变C++的教学和使用方式。 - Paolo M

1
如果可以确定m_map_guest.begin()的返回类型为GuestMapType::iterator,那么两者之间应该没有区别。使用auto并不是一种神奇的动态/弱类型,它只是向编译器表明它应该自己计算出强类型,而不需要你明确指定1。这两行代码没有任何功能上的区别:
int i = 7;
auto i = 7;

因为编译器在第二个示例中使用7的类型来推断i的实际类型。通常情况下,出于同样的原因,应尽可能使用auto,就像在C语言中使用第二种方式一样。
ttype *x = malloc(sizeof (ttype));
ttype *x = malloc(sizeof (*x));

如果类型更改为其他类型,则后者仅需要进行一次更改 - 如果实际类型和声明可以分开得更远,那么这将变得更加重要,特别是在使用auto时。

1 当返回类型不同时,例如隐式转换或子类,编译器很难确定您想要的类型。因此,在这些情况下可能无法正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接