C++:类作用域

C++:类作用域

标签(空格分隔): c++


  • C类作用域
    • 类成员的三种访问形式
    • 类作用域常量
    • c11 作用域内枚举

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

类成员的三种访问形式

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

Student student;
student.show();

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

Student *student = new Student();
student->show();

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

void Student::show(){
    cout<<Student::name<<endl;
}

类作用域常量

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

class Stack{
private:
    enum{size=30}
public:
};

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

    enum{size=30}
    double costs[size];

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

class Stack{
private:
    static const int size = 30;
    double costs[size];
public:
};

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

c++11 作用域内枚举

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

enum class chinese{teacher};
enum class english{teacher};

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

int x = int(chinese::teacher);

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

enum class:short color{red,blue};

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

你可能感兴趣的:(C++)