您当前的位置: 首页 >  c++

RuiH.AI

暂无认证

  • 0浏览

    0关注

    274博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

C++学习 十三、类 (3)类作用域,枚举类

RuiH.AI 发布时间:2022-02-15 13:05:49 ,浏览量:0

C++学习 十三、类 (3)类作用域,枚举类
  • 前言
  • 类作用域
  • 类内常量,枚举
    • 成员初始化
    • 静态成员
    • 类内枚举
  • C++11枚举类
  • 后记

前言

本篇是类基础中的补充部分,类作用域,枚举类。

类作用域

之前作用域篇中提到了全局作用域和局部作用域,以及命名空间作用域,此外C++类引入了类作用域。

类中的名称,即数据成员和成员函数,作用域都为整个类,在类内是已知的,类外是未知的。

类中的名称不会与类外名称冲突。

在定义类方法时,必须使用作用域解析运算符::,如下所示:

SimpleClass::SimpleClass(int a=1){
	a_ = a;
}

SimpleClass::add() {
	a_++;
}

在类声明和定义的代码块中,因为已经限定在类内,因此不需要使用作用域解析符。

在调用类方法时,类作用域限制意味着不能从类外直接访问类的成员。对象调用相当于给成员提供了类作用域解析:

SimpleClass sc = SimpleClass(2);
sc.add();

构造函数与类名相同,因此在类作用域内,可以直接使用。而add()方法就必须通过对象来提供类作用域解析。

类内常量,枚举

如果类内有一个常量,该常量对所有该类的对象都是相同的。

成员初始化

C++11的成员初始化可以直接在类内定义常量:

class SimpleClass{
	private:
		const int b = 10;
}

而在C++11之前,这样的类内定义不被允许。类内常量必须通过静态成员或者类内枚举实现。

成员初始化将在后续类的进阶中继续学习。

静态成员

类的静态成员与程序中的其它静态成员存放在一起,而不存储在对象中。因此,静态成员只有一个,被所有同类对象分享:

class SimpleClass{
	private:
		static const int b = 10;
}

静态成员将在类的进阶中继续学习。

类内枚举

类声明中的枚举作用域在类内,因此类内枚举相当于是为整个类提供了整型符号常量:

class SimpleClass{
	private:
		enum myEnum {Months = 12};
		double costs[Months];
}

这里的Months是一个符号名称,作用域为类内。

这里的枚举myEnum只是为类提供了一种新的类型,而不是数据成员。所有对象都不会包含枚举,但可以包含枚举变量。

注意:枚举量只能是整型数据。

C++11枚举类

C++11中引入了枚举类,也叫强类型枚举scoped enum type

老式枚举unscoped enum type可能会出现两个枚举的枚举量出现重名冲突:

enum color_old {red, blue, green, orange};
enum fruit_old {appple, blueberry, watermelon, orange};

这两个枚举在同一作用域内,因此同名枚举量orange会发生冲突。

C++11的枚举类,枚举量被限制了在其枚举类的作用域中:

enum color_old {red, blue, green, orange};
enum class color {red, blue, green, orange};
enum class fruit {appple, blueberry, watermelon, orange};

void main(){
	color_old a = orange;
	color b = color::orange;
	fruit c = fruit::orange;
}

使用枚举类中的枚举量时,必须使用作用域解析符指定枚举类名,因此避免了名称冲突。

老式枚举将能够隐式转换为整型,但枚举类不能隐式转换为整型:

enum color_old {red, blue, green, orange};
enum class color {red, blue, green, orange};
enum class fruit {appple, blueberry, watermelon, orange};

void main(){
	color_old a = orange;
	color b = color::orange;
	fruit c = fruit::orange;
	
	int aa = orange;
	int bb = color::orange; // error1!
	color::orange             
关注
打赏
1658651101
查看更多评论
0.0453s