class Test {
bool isVal() const {
return isVal;
}
private:
bool isVal;
};
Run Code Online (Sandbox Code Playgroud)
在编译这个文件时,它说
testClass.cpp:9:`bool Test :: isVal'的声明
testClass.cpp:3:与之前的声明`bool Test :: isVal()'冲突
虽然这同样适用于java
class Test {
private boolean isVal;
public boolean isVal() {
return isVal;
}
}
Run Code Online (Sandbox Code Playgroud)
不知道为什么C++无法解决这个问题.
Joh*_*itb 67
因为C++不是Java.您可以获取会员的地址:
&Test::isVal
Run Code Online (Sandbox Code Playgroud)
所以你不能让两个成员具有相同的名称,除了你可以重载成员函数.即使你可以通过某种演员来消除歧义,下一个问题也会出现在其他地方.
在C++中,包括我在内的很多人通常都会专门调用数据成员,比如m
在他们的名字前面加上一个.这避免了这个问题:
class Test {
public:
bool IsVal() const { return mIsVal; }
private:
bool mIsVal;
};
Run Code Online (Sandbox Code Playgroud)
小智 13
C++将名称修改应用于函数名称和全局变量.局部变量不会受损.问题出现了,因为在C中你可以访问变量或函数的地址(因此在C++中也是如此),例如:
struct noob{
bool noobvar;
void noobvar(){};
};
Run Code Online (Sandbox Code Playgroud)
可以说,为什么不将名称修改应用于局部变量,然后有一个内部本地表示,如
bool __noobvar_avar;
void __noobvar_void_fun;
Run Code Online (Sandbox Code Playgroud)
并假设它们分别在执行0x000A和0x00C0期间接收地址.
但是,如果我们在代码中的某处写:
&noob::noobvar
Run Code Online (Sandbox Code Playgroud)
该计划应该做什么?
您可以看到,因为在C中,因此在C++中,您可以发出"地址",在相同的分辨率范围内使用具有相同名称的变量和函数是不合法的.
快速的答案是“因为这就是C ++的工作方式”。C ++没有用于成员变量和成员函数(即“方法”)的单独名称空间,而Java(显然,我还没有尝试过)可以这样做。
在任何情况下,请记住是谁去看医生,说那家伙老故事“医生,我这样做时,它会伤害这个。” 医生回答说“好吧,不要那样做!” 这是成为哑巴程序员技巧的一种语言特性。
C++ 草案标准 N3337 中的以下部分指定何时可以重载名称。
13 超载
1 当在同一范围内为单个名称指定两个或多个不同的声明时,该名称被称为重载。通过扩展,同一作用域中声明相同名称但具有不同类型的两个声明称为重载声明。只能重载函数和函数模板声明;变量和类型声明不能重载。
当您将类定义为:
class Test {
bool isVal() const {
return isVal;
}
private:
bool isVal;
};
Run Code Online (Sandbox Code Playgroud)
isVal
您正在类的范围内重载该名称。isVal
仅当是成员函数时才允许这样的重载。isVal
当是成员变量时不允许。
归档时间: |
|
查看次数: |
37678 次 |
最近记录: |