C ++ 11 auto /我不明白的东西

时间:2015-11-09 08:09:20

标签: c++ c++11

确定。这是我的代码:

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;简化我的代码? 我的问题是。影响我的程序?有风险吗?

2 个答案:

答案 0 :(得分:5)

完全没问题,从我看来,用auto声明迭代器是一个很好的做法,至少有两个原因:

1-通常,迭代器的类型很长。输入的次数越少,误输的次数就越少。它使代码更加清晰,因为在这种情况下隐藏了一个并不重要的实现细节

2- 向前兼容性:当您修改代码时,即迭代器类型名称的名称时,您不必更改使用auto的代码。毕竟,您想要使用那种类型的迭代器,与其名称无关。

答案 1 :(得分: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变得更加重要,因为实际类型和声明可以更广泛地分开。 / p>

1 当然,如果返回类型不同,,例如隐式转换或子类,编译器有点难以找出你的类型想。因此在这些情况下可能不起作用。