[关闭]
@cxm-2016 2016-09-05T10:21:26.000000Z 字数 1157 阅读 1953

C++:类作用域

c++ no


全局变量可以在文件的任意位置使用它,但是局部变量只能在其所属的代码块中使用。C++中引入了一种新的作用域,类作用域。作用域为类的名称在整个类中是已知的,在类外是不可见的。也就是说,作用域为类的成员只能被通过对象调用。

类成员的三种访问形式

使用类成员时,必须根据上下文使用直接成员运算符(.)、间接成员运算符(->)或作用域解析符(::)
1,直接成员运算符:使用在对象上,以调用成员

  1. Student student;
  2. student.show();

2,间接成员运算符,一般用在对象指针上

  1. Student *student = new Student();
  2. student->show();

3,作用域解析符:常用在类的内部

  1. void Student::show(){
  2. cout<<Student::name<<endl;
  3. }

类作用域常量

在类的内部创建常量不能直接使用const,因为类的声明只是描述了对象的形式,并没有创建对象。因此在对象创建之前,将没有用于存储的空间。但有两种方式可以实现相同的效果。
1,在类中声明一个枚举

  1. class Stack{
  2. private:
  3. enum{size=30}
  4. public:
  5. };

此时我们能够使用size常量作为栈的最大长度。假如我们想声明一个double类型的常量,可以在枚举下声明类型。

  1. enum{size=30}
  2. double costs[size];

此时就可以将size当做浮点型类操作了。
2,使用static关键字

  1. class Stack{
  2. private:
  3. static const int size = 30;
  4. double costs[size];
  5. public:
  6. };

在c++98中,只能使用static声明整数或者枚举的静态常量,c++11消除了这种限制。

c++11 作用域内枚举

当我们使用的枚举中包含名称冲突时,我们可以采用作用域为类的新枚举类型

  1. enum class chinese{teacher};
  2. enum class english{teacher};

这样我们可以采用上述这种方式来给各门课的老师设置常量。我们可以使用class或者struct中任意一个关键字。
这里需要注意的是常规枚举可以自动当做ing整型去使用,但是作用域枚举如果想要当成int使用必须经过强转

  1. int x = int(chinese::teacher);

c++枚举的实现默认为int,但是在c++98中,枚举的表示与操作系统相关。c++11中统一了枚举的格式为int。并且如果我们不想使用默认的int还能通过下列语法更换枚举的底层实现。

  1. enum class:short color{red,blue};

此时底层枚举实现为short类型,可以节省内存。注意:自定义类型必须是整型。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注