为什么C ++允许变量名和类名相同?

时间:2010-12-17 07:26:56

标签: c++ naming-conventions

#include <iostream>
#include <vector>   

using namespace std; 

typedef int UINT4;

class Hack
{};

Hack& operator <(Hack& a , Hack& b) 
{
    std::cerr << "1";  
    return a; 
}

Hack& operator >(Hack& a, Hack& b)
{
    std::cerr <<  "2";    
    return a; 
}

int main()
{
    Hack vector; // It SHOULD be OK!?
    Hack UINT4; // It SHOULD be OK!?
    Hack v;
    Hack Hack; // It SHOULD be OK!?
    Hack = v; // It SHOULD be OK!?

    // Please stop to think for a moment: What will the following output?
    vector<UINT4> v; 

    // Oh, my god! The whole world goes mad!

    return 0; 
} 

2 个答案:

答案 0 :(得分:7)

有没有听说过following?请仔细查看参数类型:)

int stat(const char *path, struct stat *buf);

你在问题​​中展示的内容真的不太戏剧化。您在本地范围中声明变量名称,但程序中的类型名称在全局范围内。我现在会告诉你一些真正的变态:

int nooo = 0;
int main() {
   int nooo = 0;
}

W00t?为什么C ++允许我们创建两个同名变量!?!

好吧,我在开玩笑。我现在将向您介绍弄乱重复名称的真实黑暗面。考虑一下C ++允许我们做什么!

struct A {
  int A; // noes!
};

A A; // another A!

本质上,这个一个用于C兼容:)

答案 1 :(得分:6)

您从问题的角度提问或者知道的人正在使用类名作为变量标识符:显然,这不是最佳做法。< / p>

现在,让我们反过来说:假设你不知道你所包含的一些模糊的头文件中有一个奇怪的typedef int i;。您是否希望它打破以下无辜的代码?

int i = 0;