C++ 枚举访问求解 求助

heiyedebing 2013-10-01 05:19:01
#includeclass T
{
int a;
public:
enum{one,two,three};
T(int aa=0):a(aa){}
};
void main()
{
cout<<T::two<<endl;//这里为什么可以通过类名直接访问??
}
我不明白T::two为什么可以通过类名直接访问,这里通过类名直接访问枚举就应该说明这个枚举只与类有关,与具体的对象无关,也就是说应该是静态成员,难道枚举是static成员???
...全文
435 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
追求执着 2013-11-30
  • 打赏
  • 举报
回复
枚举的定义,就如类中的public成员一样,也可以直接访问
lm_whales 2013-11-30
  • 打赏
  • 举报
回复
类名可以访问的有 函数,枚举常量,类型定义,成员指针,成员函数指针。 其中 类的静态函数,静态变量(常量),内部的枚举类型定义的常量,类内部定义的类型,都可以通过类名而不是对象访问(引用)。 枚举常量可以通过类名和作用域限定符访问的原因是, 1)和C兼容更简单。 2)C++ 枚举是对C枚举类型的扩展,所以很自然的就成了这个样子。 ----C枚举类型定义的作用域为 2.1)整个程序,对应 C++的全局作用域:: // 定义在头文件即可(这是通过多份定义实现的,因为枚举常量名,属于常量)。 2.2) 整个文件,//定义在.cpp 等实现文件内部即可。 2.3) 整个函数,//定义在函数的最外层大括号内部。 2.4)函数内部某个语句组,//定义在语句组内部。
lm_whales 2013-11-30
  • 打赏
  • 举报
回复
枚举常量的作用域,是定义枚举类型的那个作用域。 这里分两步看就可以了 1)枚举类型的作用域 2)枚举常量的作用域 C++ 枚举常量,是枚举类型的作用域内,定义的常量,它的作用域可以超出枚举类型,出现在定义枚举类型的那个作用域内。 这是C的痕迹。 因为,C枚举常量值的名字,就像我们平时,给颜色起名字一样, 不用说颜色红,直接说红就可以了,我们知道红是一种颜色。 这样C的枚举类型,只要枚举常量本身,就可以表示对应的枚举常量值了。 C++为了兼容C,就让枚举常量的作用域超出枚举类型; 出现在,定义枚举类型的,那个作用域内了。
YorkChen1989 2013-11-25
  • 打赏
  • 举报
回复
引用 11 楼 mingliang1212 的回复:
[quote=引用 10 楼 love4Mario 的回复:] [quote=引用 6 楼 mingliang1212 的回复:] 枚举可以是类的成员。 ::是作用域运算符。 简单的说,看c++primer
这两点想必楼主都知道才会问出这个问题的。[/quote] 显然你和楼主都不知道什么叫做类的成员。 可以用. 和 -> 访问得到的, 用::肯定可以访问得到。 反之不然。 顺便说一下8l 的A::engNum::zero; 是错的。[/quote] 我觉得楼主应该知道可以用作用域符号访问成员变量,但是他问的是在不创建一个类对象的时候用与作用符号访问枚举型变量为什么可以,因为非静态成员变量是无法被以这种方式访问的。
漫步者、 2013-11-21
  • 打赏
  • 举报
回复
iamnobody 2013-11-21
  • 打赏
  • 举报
回复
引用 10 楼 love4Mario 的回复:
[quote=引用 6 楼 mingliang1212 的回复:] 枚举可以是类的成员。 ::是作用域运算符。 简单的说,看c++primer
这两点想必楼主都知道才会问出这个问题的。[/quote] 显然你和楼主都不知道什么叫做类的成员。 可以用. 和 -> 访问得到的, 用::肯定可以访问得到。 反之不然。 顺便说一下8l 的A::engNum::zero; 是错的。
YorkChen1989 2013-11-21
  • 打赏
  • 举报
回复
引用 6 楼 mingliang1212 的回复:
枚举可以是类的成员。 ::是作用域运算符。 简单的说,看c++primer
这两点想必楼主都知道才会问出这个问题的。
YorkChen1989 2013-11-21
  • 打赏
  • 举报
回复
引用 2 楼 lm_whales 的回复:
这是类内部定义的枚举常量,不用类名访问,用什么方式访问????
楼主的意思是枚举非静态成员,所以不可以用作用域符号访问,应该先创建对象再访问。
lm_whales 2013-11-21
  • 打赏
  • 举报
回复
非静态成员变量,也可以通过类名,用作用域限定符访问, 不过还是要通过对象来访问。 而静态成员变量,和枚举常量,可以直接通过类名访问。 通过对象访问,在语法上也是可以的, 不过编译器还是会,直接转换成,类名方式访问。 举例如下: #include<iostream> class A{ public: A():a(0){}; int a; }; class B:public A{ public: enum {red,green,blue}; int a; B():a(1){}; void show (){ std::cout<<A::a<<std::endl; std::cout<<B::a<<std::endl; }; static int s_var; }; int B::s_var = 0;//静态变量。 int main(){ B b; b.show(); //类的非静态变量,通过对象访问 std::cout<<b.B::a<<std::endl; //类的非静态变量,通过对象和类名,作用域限定符访问 //没有这种屏蔽,也可以加类名,不过有点多此一举的感觉。 std::cout<<b.a<<std::endl;//子类和父类定义了同名变量, //子类定义的变量屏蔽了父类的同名变量。 //不加类名,就是子类的变量,加了类名, //是类名表示的类(父类或子类)的变量。 std::cout<<b.B::a<<std::endl;//子类和父类定义了同名变量,强调一下用子类的变量。 std::cout<<b.A::a<<std::endl;//A::a 被屏蔽,只有通过类名作用域限定符访问。 //枚举常量的访问方式: std::cout<<B::red<<std::endl;//这是最合适的访问方式。 std::cout<<b.red<<std::endl; //这个实际是std::cout<<B::red<<std::endl; B::s_var = 10;//类名访问 std::cout<<B::s_var<<std::endl;//这是最合适的访问方式。 std::cout<<b.s_var<<std::endl; //这个实际是std::cout<<B::red<<std::endl; b.s_var = 100; //通过对象访问,实际上还是B::s_var = 100; std::cout<<B::s_var<<std::endl;//这是最合适的访问方式。 std::cout<<b.s_var<<std::endl; //这个实际是还是 std::cout<<B::s_var<<std::endl; std::cout<<b.B::s_var<<std::endl; //这个也是可以的,虽然基本上没有人这么做; return 0; }
lm_whales 2013-11-21
  • 打赏
  • 举报
回复
枚举常量,不是非静态成员变量性质的数据。
lm_whales 2013-11-21
  • 打赏
  • 举报
回复
引用 9 楼 love4Mario 的回复:
[quote=引用 2 楼 lm_whales 的回复:] 这是类内部定义的枚举常量,不用类名访问,用什么方式访问????
楼主的意思是枚举非静态成员,所以不可以用作用域符号访问,应该先创建对象再访问。[/quote] 不需要对象,就可以访问枚举常量,枚举常量,不是非静态员变量性质的数据。
ForestDB 2013-11-21
  • 打赏
  • 举报
回复
对于enum,T不是类,只是个namespace。
lm_whales 2013-10-02
  • 打赏
  • 举报
回复
class A{ public: enum engNum{zero,one,two,three};// 有名枚举类型 }; //有名枚举类型 //类名,和枚举类型名,两层作用域,两个作用域限定符。 A::engNum::zero; A::engNum::one ; A::engNum::two ; A::engNum::three ; class A{ public: enum {zero,one,two,three};// 匿名枚举类型。 }; // 匿名枚举类型。 A::zero; A::one ; A::two ; A::three ; class A{ public: struct {int x,y;};//类内部匿名的结构,类,联合,定义的非静态成员变量是 类的一部分,是类对象的一个组成部分。 }; A a; a.x; a.y; class A{ public: struct point{int x,y;};//有名的结构,类,联合,是类内部定义的嵌套类型。 }; A::point p; p.x; p.y; 类内部的匿名类型中,定义中的标识符,是类的一部分。 对于类和名空间,大概都是这样的。 不过类内部的,匿名的结构,类,联合内部的非静态成员变量,属于类对象的一部分。 类内部的,匿名的枚举类型,定义的枚举常量,属于类的一部分,和类静态整型常量---已经初始化的---,地位差不多。
申祷无 2013-10-02
  • 打赏
  • 举报
回复
T::two是个用户自定义类型的“字面常量”,这个有点像"abc"。 类其实也是个名字空间,所以这个枚举也可以看成是一个定义在名字空间中的类型,只不过这个类型没有名字,但是还是可以通过名字空间的语法来访问的。 你可以看一下这个: http://www.cplusplus.com/reference/vector/vector/ 这里面类型和其他的成员函数其实是分开的,它单独就算是一“类”(不是C++中的类,常用的那个类)“东西”。 我个人还是倾向于把这个看做是名字空间中的类型的(我有点记不清官方是怎么解释的了),因为你在全局域里也是可以定义enum的,使用::就可以访问全局域了,这和类中的枚举很像。但是全局中应该是没法定义成员函数和成员对象的。
iamnobody 2013-10-01
  • 打赏
  • 举报
回复
枚举可以是类的成员。
::是作用域运算符。
简单的说,看c++primer
qq120848369 2013-10-01
  • 打赏
  • 举报
回复
学习一下c++11的enum class和enum的差别。
lm_whales 2013-10-01
  • 打赏
  • 举报
回复
这是类内部定义的,无名枚举类型的,枚举常量, 不用类名和对象访问方式访问,请问还有别的办法吗????
baichi4141 2013-10-01
  • 打赏
  • 举报
回复
枚举不是成员,所以不分静态不静态 枚举是一个宏,就跟#define一样
lm_whales 2013-10-01
  • 打赏
  • 举报
回复
这是类内部定义的枚举常量,不用类名访问,用什么方式访问????
taodm 2013-10-01
  • 打赏
  • 举报
回复
这就是一个规定。别把类型和成员扯在一起硬套规则。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧