当前位置: 首页 > news >正文

商城网站前置审批中国建设行业峰会官方网站

商城网站前置审批,中国建设行业峰会官方网站,东莞网站公司,平果最新款手机欢迎阅读我的 【CPrimer】专栏 专栏简介#xff1a;本专栏主要面向C初学者#xff0c;解释C的一些基本概念和基础语言特性#xff0c;涉及C标准库的用法#xff0c;面向对象特性#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施#xff0c;使你更加适应高级… 欢迎阅读我的 【CPrimer】专栏 专栏简介本专栏主要面向C初学者解释C的一些基本概念和基础语言特性涉及C标准库的用法面向对象特性泛型特性高级用法。通过使用标准库中定义的抽象设施使你更加适应高级程序设计技术。希望对读者有帮助 目录 7.4 类的作用域作用域和定义在类外部的成员名守查找与类的作用域用于类成员声明的名字查找 类型名要特殊处理成员定义中的普通块作用域的名字查找类作用域之后,在外围的作用域中查找在文件中名字的出现处对其进行解析 7.4 类的作用域 每个类都会定义它自己的作用域。在类的作用域之外,普通的数据和函数成员只能由对象、引用或者指针使用成员访问运算符来访问。对于类类型成员则使用作用域运算符访问。不论哪种情况,跟在运算符之后的名字都必须是对应类的成员: Screen::pos ht24,wd80;//使用Screen定义的pos类型 Screen scr(ht,wd, ); Screen *pscr; char c scr.get();//访问scr对象的get成员 c p-get();//访问p所指对象的get成员作用域和定义在类外部的成员 一个类就是一个作用域的事实能够很好地解释为什么当我们在类的外部定义成员函数时必须同时提供类名和函数名。在类的外部,成员的名字被隐藏起来了。 一旦遇到了类名,定义的剩余部分就在类的作用域之内了,这里的剩余部分包括参数列表和函数体。结果就是,我们可以直接使用类的其他成员而无须再次授权了。 例如,我们回顾一下Window_mgr类的clear成员,该函数的参数用到了Window_mgr类定义的一种类型: void Window_mgr::clear(ScreenIndex i) { ScreensScreens[i]; s.contentsstring(s.height*s.width, ); }因为编详器在处理参数列表之前已经明确了我们当前正位于Window_mgr类的作用域中,所以不必再专门说明ScreenIndex是Window_mgr类定义的。出于同样的原因,编译器也能知道函数体中用到的screens也是在Window_mgr类中定义的。 另一方面,函数的返回类型通常出现在函数名之前。因此当成员函数定义在类的外部时,返回类型中使用的名字都位于类的作用域之外。这时,返回类型必须指明它是哪个类的成员。例如,我们可能向windowmgz类添加一个新的名为addscreen的函数,它负责向显示器添加一个新的屏幕。这个成员的返回类型将是ScreenIndex,用户可以通过它定位到指定的Screen: class Window_mgr{ public: //向窗口添加一个Screen,返回它的编号 ScreenIndex addScreen(const Screen); //其他成员与之前的版本一致 }; //首先处理返回类型,之后我们才进入Window_mgr的作用域 Window_mgr::ScreenIndex Window_mgr::addScreen(const Screens) {screens.push_back(s);return screens.size()-1; }因为返回类型出现在类名之前,所以事实上它是位于Window_mgr类的作用域之外的。在这种情况下,要想使用ScreenIndex作为返回类型,我们必须明确指定哪个类定义了它。 名守查找与类的作用域 在目前为止,我们编写的程序中,名字查找(name lookup)(寻找与所用名字最匹配的声明的过程)的过程比较直截了当: 首先,在名字所在的块中寻找其声明语句,只考虚在名字的使用之前出现的声明。如果没找到,继续查找外层作用域。如果最终没有找到匹配的声明,则程序报错。 对于定义在类内部的成员函数来说,解析其中名字的方式与上述的查找规则有所区别,不过在当前的这个例子中体现得不太明显。类的定义分两步处理: 首先,编译成员的声明。直到类全部可见后才编译函数体。 按照这种两阶段的方式处理类可以简化类代码的组织方式。因为成员函数体直到整个类可见后才会被处理,所以它能使用类中定义的任何名字。相反,如果函数的定义和成员的声明被同时处理,那么我们将不得不在成员函数中只使用那些已经出现的名字。 用于类成员声明的名字查找 这种两阶段的处理方式只适用于成员函数中使用的名字。声明中使用的名字,包括返回类型或者参数列表中使用的名字,都必须在使用前确保可见。如果某个成员的声明使用了类中尚未出现的名字,则编译器将会在定义该类的作用域中继续查找。例如: typedef double Money; string bal; class Account{ public: Money balance(){ return bal; } private: Money bal; };当编译器看到balance函数的声明语句时,它将在Account类的范围内寻找对Money的声明.编译器只考虑Account中在使用Money前出现的声明,因为没找到匹配的成员,所以编译器会接着到Account的外层作用域中查找.在这个例子中,编译器会找到Money的typedef语句,该类型被用作balance函数的返回类型以及数据成员bal的类型。另一方面,balance函数体在整个类可见后才被处理,因此,该函数的return语句返回名为bal的成员,而非外层作用域的string对象。 类型名要特殊处理 -般来说,内层作用域可以重新定义外层作用域中的名字,即使该名字已经在内层作用域中使用过。然而在类中,如果成员使用了外层作用域中的某个名字,而该名字代表一种类型,则类不能在之后重新定义该名字: typedef double Money; class Account{ public: Money balance(){ return bal;}//使用外层作用域的Money private: typedef double Money;//错误:不能重新定义Money Money bal; // ... }需要特别注意的是,即使Account中定义的Money类型与外层作用域一致,上述代码仍然是错误的。 尽管重新定义类型名守是一种错误的行为,但是编译器并不为此负责。一些编译器仍将顺利通过这样的代码,而忽略代码有错的事实。 类型名的定义通常出现在类的开始处,这样就能确保所有使用该类的成员都出现在类名的定义之后。 成员定义中的普通块作用域的名字查找 成员函数中使用的名字按照如下方式解析: 首先,在成员函数内查找该名字的声明。和前面一样,只有在函数使用之前出现的声明才被考虑。如果在成员函数内没有找到,则在类内继续查找,这时类的所有成员都可以被考虑。如果类内也没找到该名字的声明,在成员函数定义之前的作用域内继续查找。 一般来说,不建议使用其他成员的名字作为某个成员函数的参数。不过为了更好地解释名字的解析过程,我们不妨在dummy_fcn函数中暂时违反一下这个约定: //注意:这段代码仅为了说明而用,不是一段很好的代码 //通常情况下不建议为参数和成员使用同样的名字 int height;//定义了一个名字,程后将在Screen中使用 class Screen{ public: typedef std::string::size_type pos; void dummy_fcn(pos height){cursor width*height;//哪个height?是那个参数 } private: pos cursor0; pos height0,width0; };当编译器处理dummy_fcn中的乘法表达式时,它首先在函数作用域内查找表达式中用到的名字。函数的参数位于函数作用域内,因此dummy_fcn函数体内用到的名字height指的是参数声明。 在此例中,height参数隐藏了同名的成员。如果想绕开上面的查找规则,应该将代码变为: //不建议的写法:成员函数中的名字不应该隐藏同名的成员 void Screen::dummy_fcn(pos height){ cursorwidth*this-height;//成员height //另外一种表示该成员的方式 cursor width* Screen::height;//成员height }尽管类的成员被隐藏了,但我们任然可以通过加上类的名字或者显示的使用this指针来强制访问成员。 其实最好的确保我们使用height成员的方法是给参数起个其他名字: //建议的写法:不要把成员名字作为参数或其他局部变量使用 void Screen::dummy_fcn(pos ht){ cursorwidth*height;//成员height }在此例中,当编译器查找名字height时,显然在dummy_fcn函数内部是找不到的。编译器接着会在Screen内查找匹配的声明,即使height的声明出现在dummy_fcn使用它之后,编诙器也能正确地解析函数使用的是名为height的成员。 类作用域之后,在外围的作用域中查找 如果编译器在函数和类的作用域中都没有找到名字,它将接着在外围的作用域中查找。在我们的例子中,名字height定义在外层作用域中,且位于screen的定义之前。然而,外层作用域中的对象被名为height的成员隐藏掉了。因此,如果我们需要的是外层作用域中的名字,可以显式地通过作用域运算符来进行请求: //不建议的写法:不要隐藏外层作用域中可能被用到的名守 void Screen::dummy_fcn(pos height){cursorwidth*::height;//哪个height?是那个全局的 }尽管外层的对象被隐藏掉了,但我伴依然可以用作用域运算符访问它。 在文件中名字的出现处对其进行解析 当成员定义在类的外部时,名字查找的第三步不仅要考虑类定义之前的全局作用域中的声明,还需要考虑在成员函数定义之前的全局作用域中的声明。例如: int height;//定义了一个名字,稍后将在Screen中使用 class Screen{ public: typedef std::string::size_type pos; void setHeight(pos); pos height0;//隐藏了外层作用域中的height };Screen::pos verify(Screen::pos); void Screen::setHeight(pos var){//var:参数//height:类的成员//verify:全局函数heightverify(var); }请注意,全局函数verify的声明在Screen类的定义之前是不可见的。然而,名字查找的第三步包括了成员函数出现之前的全局作用域。在此例中,verify的声明位于 setHeight的定义之前,因此可以被正常使用。
http://www.dnsts.com.cn/news/220113.html

相关文章:

  • 一般网站建设收费几年合同佛山网站设计制作免费咨询
  • 哪里有做美食的视频网站百度网站关键词和网址
  • 湛江做网站的有哪些梅州高铁
  • 四川红叶建设有限公司网站wordpress模板文件夹
  • 潍坊营销型网站wordpress动态计时
  • php中英双语农业公司网站源码简单创新设计小产品
  • 做旅游网站需要引进哪些技术人才网站后台管理系统需求
  • 做ppt的背景图片网站成都网站设计学校
  • 自己怎么样做网站网站源码大全
  • 凡科网站怎么做友情链接扬州建设银行网站
  • 更合高明网站建设哪有做网站的公司
  • 专业做网站 郑州网站新闻字体
  • 网站建设销售职责电商平台模板
  • 建设营销型网站的优势优秀电商设计网站有哪些内容
  • 网站建设的素材网站公共模板是什么意思
  • 网站推广产品西安网约车租赁公司哪家好
  • 石家庄免费建站模板头像logo免费一键生成
  • 互联网营销型网站江苏建设行业证书编号查询网站
  • 康定网站建设工作室网络营销课程设计计划书
  • 百度网站建设需要钱信息流广告的核心是
  • 北京app手机网站制作网站建设 顺德
  • 东莞高明网站设计wordpress显示浏览次数
  • 厦门网站设计公司排名手机报价网最新价格
  • 上海做网站seowordpress sql 导入数据库
  • 网站建设推广软文网页设计与制作设计报告
  • 虚拟主机WordPress建站wordpress发布文章报错
  • 阿里云里面网站建设软件定制开发系统
  • flashfxp怎么做网站青云 wordpress加速
  • 有什么网站可以做家装怎么在网站中搜索关键字
  • wordpress站点名称的影响自己做的网站能上传到凡科吗