1. 作用域与隐藏名字
作用域需用::来访问,或用using指示以省略::来访问。
类也有一个作用域,所以,尽管两个类的成员完全相同,其成员认识有差别的。如:
class same{
public:
default_random_engine same;
void get_number();
};
class same_too{
public:
default_random_engine same;
void get_number();
};
我们看到,两边的成员是完全一样的,但是,他们处在两个不同的作用域中,所以是有差别的。
隐藏
由于是两个作用域,所以互相之间隐藏了其它作用域的名字。
2.局部作用域与静态成员
一般来说,局部作用域一般指函数的作用域,离开作用域之后所有非静态成员都将会执行析构函数。但是,静态成员除外。
当我们需要保存上一次函数的运行数据是,局部静态成员就非常有用了。
如以下代码:
class example{
public:
int count_calls_times()
{
static int times;
return timrs++;//因为是局部静态成员,所以times并不会被析构
}
};
局部作用域不可用“::”访问
由于局部作用域的成员会被销毁(静态成员除外),所以我们不能用::来访问。
3.初识嵌套类及嵌套类作用域
嵌套类是指在类内部,成员函数之外定义的类。但是,嵌套类也是一个独立的类,因此,它也有可见性。外部类可以用访问说明符来操纵嵌套类的可见性。嵌套类在外部类中可以访问,出了外部类便需要::来访问。如:
class A{
public:
class B{
};
};
B是外界可以用::来访问的。
class A{
public:
class B{
};
B* pointer;//是合法的
};
但是如果为private或protected,类的用户便不可访问了。
同第1章所讲,外部类的成员也会被隐藏
4.进入类的作用域
当我们在类内声明了一个成员函数,要在类外定义时,就需要进入类的作用域。进入作用域以::开始。
class A{
public:
ostream print(ostream&sto,const string&ost);
};
ostream& A::print(ostream&sto,const string&ost)//有A::,我们进入A的作用域了
{
sto<<ost;
return sto;
}
只要加了类名::,就进入了类的作用域
覆盖警告:
你有可能会在类内定义一个在其它作用域中已经出现过的变量。这是,你便要小心二义性错误了。如如下代码是错误的:
class error{
public:
int a;
};
class error_too{
public:
int a;
};
int main()
{
error object;
object.a;
//哪个a?
//...
return 0;
}
上述代码是错误的,因为它没有说明是哪个a。应如何改呢?答案如下:
int main()
{
error object;
object.error::a;
//或error_too::a;
//...
return 0;
}
小心哦!!!
无需担心与全局作用域混淆
因为全局作用域中的变量不需要用.
来访问,因此无需担心会混淆。
如有错误,请在评论中提出。
感谢!!!
来源:CSDN
作者:abcd7038
链接:https://blog.csdn.net/abcd7038/article/details/104524144