【和春笋一起学C++】(三十九)类作用域
目录
1、类作用域的含义
2、作用域为整个类的常量
1、类作用域的含义
C++中引入了一种新的作用域——类作用域。
在类中定义的名称(数据成员名和成员函数名)的作用域都为整个类,作用域为整个类的名称只在该类中是已知的,在类外是不可知的。因此,在不同的类中使用相同的类成员名不会引起冲突。另外,类作用域也意味着不能从外部直接访问类的成员,包括公有成员函数。要调用公有成员函数,必须通过类对象。
在定义类的成员函数时,必须使用作用域解析操作符指出其所属的类。如Student类中的get_average_score()函数定义,在函数名前指出了该函数是属于Student类的成员函数。
int Student::get_average_score()
{using namespace std;show_score();int average= (yuwen_score + shuxue_score + yingyu_score) / 3;cout << "平均分:" << average << endl;return average;
}
在类声明或成员函数定义中,使用同类的成员函数和数据成员时不需要加修饰符。如get_average _score()函数的定义中调用show_score()函数时不需要加修饰符。
原文为CSDN作者:三月微暖寻春笋
2、作用域为整个类的常量
假设需要创建一个由所有对象共享的常量,如在Student类中需要声明一个分数最大值100,在类声明中使用常规的常量声明方式声明一个常量,如下:
class Student
{
public:...private:const int max_score = 100;
};
这是不可行的,因为类声明只是描述了对象的形式,并没有真正创建对象,在类对象被创建之前,没有用于存储值的内存空间。
在C++中有两种方式可以创建一个所有对象共享的常量。第一种方式是声明一个枚举,在类中声明的枚举,它的作用域为整个类,因此,可以用枚举为整型常量来提供作用域为整个类的符号名称。如下:
class Student
{
public:...private:enum {max_score=100};
};
说明:用这种方式声明枚举并不会创建类数据成员,即所有对象中都不包含枚举类型的变量,max_score只是一个符号名称,在作用域为整个类的代码中遇到它时,编译器将用30来替换它。(这里使用枚举只是为了创建符号常量,并不打算创建枚举类型的变量,因此没有提供枚举名)
第二种在类中定义常量的方式是使用关键字static。
class Student
{
public:...private:static const int max_score = 100;
};
这将创建一个名为max_score的常量,作用域为整个类,该常量与其他静态变量存储在一起,而不是存储在对象中。因此只有一个max_score常量,它被所有的Student类对象共享。