在类中定义的名称(如类数据成员和类成员函数名)的作用域都为整个类,作用域为整个类的名称只在该类中是已知的,在类外是不可知的。因此,可以在不同类中使用相同类成员名而不会引起冲突。例如,Stock类的share成员不同于JobRide的share成员,另外,类作用域不能直接从外部访问类的成员,公有函数也是如此。也就是说,要调用共有函数,必须通过对象: 定义成员函数时,必须使用作用域解析运算符
代码语言:javascript复制void Socket::update()
{
....
}
总之,在类声明或成员函数定义中,可以使用未修饰的成员的名称,构造函数在被调用时,才可以被识别,因为他的名称和类名相同
代码语言:javascript复制class IK{
private:
int fuss;
public:
IK(int f = 9)
{
fuss = f;
}
void ViewIK() const;
};
void IK::ViewIK() const
{
cout<<fuss<<endl;
}
int main()
{
IK*pik = new IK;
IK ee = IK(8);
ee.ViewIK();
pik->ViewIK();
}
作用域为类的常量
有时候使符号常量的作用域为类很有用。由于常量对于所有对象来说都是相同的,因此创建一个由所有对象共享的常量是很有必要的。
代码语言:javascript复制class Bakery
{
private:
const int Months = 12;
double dosts[Months]
}
这样可以吗?是不行的,因为目前我们是在声明,声明只是描述,并不会给成员赋值,虽然表面上我们赋值了,但没有创建对象就没有存储空间,所以数组也并没有声明 介绍两种作用域类内的方法
类中声明一个枚举
代码语言:javascript复制class Bakery
{
private:
enum {Months = 12};
double dosts[Months];
}
枚举并不会创建数据成员,所有对象都不会包含枚举,而且这只是一个符号常量,在作用域为整个类的代码遇到他时,编译器会用12替换,所谓符号常量,就是用一个字符串来替换程序中出现的标识符,和宏定义类似,内存中没有以符号常量命名的存储空间。
static static申明的常量也没有放在对象的空间中,他与其他静态变量存放在一起,而不是在对象中,可以被所有类创建的对象共享。
作用域内枚举
传统的枚举,如果我们枚举量一样的话可能发生冲突
代码语言:javascript复制enum egg{Small,Medium,Large,Jumbo};
enum t_shirt{Small,Medium,Large,Xlarge};
将无法通过编译,因为egg Small和t_shirt Small位于相同的作用域内,它们将发生冲突。C 11提供了一种新枚举,作用域为类,如:
代码语言:javascript复制enum class egg{Small,Medium,Large,Jumbo};
enum class t_shirt{Small,Medium,Large,Xlarge};
也可以用strut代替class 无论哪种方式,都需要使用枚举名来限定枚举量
egg choice = egg::Large; //the Large enumerator of the egg enum
t_shirt Floyd = t_shirt::Large; //the Large enumerator of the t_shirt enum
代码语言:javascript复制枚举量的作用域为类时,就不会发生之前的冲突了。
C 11常规枚举将会被默认转为整型,但类内枚举不能隐式转换为整型。但是我们看可以显式转换(强制)
int frodo = int(t_shirt::Small);