C++类——高级(四)《一谈作用域与类》

北战南征 提交于 2020-03-03 01:21:15

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;
}

小心哦!!!

无需担心与全局作用域混淆

因为全局作用域中的变量不需要用.来访问,因此无需担心会混淆。
如有错误,请在评论中提出。
感谢!!!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!