因为C++不是Java.您可以获取会员的地址:
&Test::isVal
所以你不能让两个成员具有相同的名称,除了你可以重载成员函数.即使你可以通过某种演员来消除歧义,下一个问题也会出现在其他地方.
在C++中,包括我在内的很多人通常都会专门调用数据成员,比如m
在他们的名字前面加上一个.这避免了这个问题:
class Test { public: bool IsVal() const { return mIsVal; } private: bool mIsVal; };
在C++中,我们通常会特别调用成员变量,就像把am放在他们的名字之前???? 我们的确是?这是语言规范吗?这是一个完美的答案,直到那句话和它后面的例子. (24认同)
joe_mucchiello,出去统计所有流行的名称,例如"data_","_ data","mData","m_data"等等.我认为这证明我使用"通常"是合理的. (9认同)
@jmu"我不认为" - "因此它[名称重整]与问题无关".我不知道你的个人事务(你的意见)对我答案中任何事情的相关性有何客观影响?*我认为他们(我们!)因为姓名冲突的问题而做错了*我*把它放到我的问题中并认为它是相关的.您尚未提供相反声明的证据. (3认同)
...而且,在幕后,这些函数实际上并没有真正使用相同的名称,因为它们通过类和参数签名来区分。 (2认同)
小智.. 13
C++将名称修改应用于函数名称和全局变量.局部变量不会受损.问题出现了,因为在C中你可以访问变量或函数的地址(因此在C++中也是如此),例如:
struct noob{ bool noobvar; void noobvar(){}; };
可以说,为什么不将名称修改应用于局部变量,然后有一个内部本地表示,如
bool __noobvar_avar; void __noobvar_void_fun;
并假设它们分别在执行0x000A和0x00C0期间接收地址.
但是,如果我们在代码中的某处写:
&noob::noobvar
该计划应该做什么?
返回变量noobvar的地址,即0x000A
返回noobvar函数的地址,即0x00C0
您可以看到,因为在C中,因此在C++中,您可以发出"地址",在相同的分辨率范围内使用具有相同名称的变量和函数是不合法的.
因为C++不是Java.您可以获取会员的地址:
&Test::isVal
所以你不能让两个成员具有相同的名称,除了你可以重载成员函数.即使你可以通过某种演员来消除歧义,下一个问题也会出现在其他地方.
在C++中,包括我在内的很多人通常都会专门调用数据成员,比如m
在他们的名字前面加上一个.这避免了这个问题:
class Test { public: bool IsVal() const { return mIsVal; } private: bool mIsVal; };
C++将名称修改应用于函数名称和全局变量.局部变量不会受损.问题出现了,因为在C中你可以访问变量或函数的地址(因此在C++中也是如此),例如:
struct noob{ bool noobvar; void noobvar(){}; };
可以说,为什么不将名称修改应用于局部变量,然后有一个内部本地表示,如
bool __noobvar_avar; void __noobvar_void_fun;
并假设它们分别在执行0x000A和0x00C0期间接收地址.
但是,如果我们在代码中的某处写:
&noob::noobvar
该计划应该做什么?
返回变量noobvar的地址,即0x000A
返回noobvar函数的地址,即0x00C0
您可以看到,因为在C中,因此在C++中,您可以发出"地址",在相同的分辨率范围内使用具有相同名称的变量和函数是不合法的.
c/c ++中的函数只是指向代码所在的内存中的位置的指针,isVal(作为布尔值)和isVal(作为函数)因此是不明确的.
快速的答案是“因为这就是C ++的工作方式”。C ++没有用于成员变量和成员函数(即“方法”)的单独名称空间,而Java(显然,我还没有尝试过)可以这样做。
在任何情况下,请记住是谁去看医生,说那家伙老故事“医生,我这样做时,它会伤害这个。” 医生回答说“好吧,不要那样做!” 这是成为哑巴程序员技巧的一种语言特性。