我是靠谱客的博主 俊逸小懒猪,最近开发中收集的这篇文章主要介绍C++12.3 类作用域(上)----需不需要加类作用域运算符 (类名: :),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

简介

类作用域—-从定义类开始到类定义体结束,这一整块是类作用域范围

1、使用类的成员—-通过对象或指针

  • 每个类都定义了自己的新作用域和唯一的类型。在类的定义体内声明类成员,将成员名引入类的作用域。类内称为类作用域,两个不同的类具有两个不同的类作用域

  • 在类的作用域外(不在类内),成员只能通过对象或指针分别使用成员访问操作符 “.”或“->”来访问。这些操作符左边的操作数分别是一个类对象或指向类对象的指针。跟在操作符后面的成员名字必须在相关联的类的作用域中声明:

2、成员在类外定义—-加上类作用域,指明属于哪个类

  • 尽管成员是在类的定义体之外定义的,但成员定义就好像他们是在类的作用域中一样.出现在类的定义体之外的成员定义必须指明成员出现在哪个类中,写上类作用域运算符

3、类外定义的成员函数,形参和函数体属于类作用域范围—-形参和函数体不需要加类作用域

  • 在定义类外部的成员函数中,形参表和成员函数都出现在成员名之后,这些都是在类作用域中定义,所以可以不用限定而引用其他成员。

4、类外定义的成员函数,函数返回类型不一定在类作用域中,所以,有些必须指明返回类型的类作用域

  • 与形参类型相比,返回类型出现在成员名字前面,如果函数在类定义体之外定义,则用于返回类型的名字在类作用域之外,返回类型前面必须加上类作用域。

  • 如果返回类型使用由类定义的类型,则必须使用完全限定名。

============================================================================================================

  • 每个类都定义了自己的新作用域和唯一的类型。在类的定义体内声明类成员,将成员名引入类的作用域。类内称为类作用域,两个不同的类具有两个不同的类作用域

  • 即使两个类具有完全相同的成员列表,他们也是不同的类型。每个类的成员不同于任何其他类(或任何其他作用域)的成员

class First{
publicint memi;
   double mend;
};
class Second{
public:
   int memi;
   double memd;
};
First obj1;
Second obj2= obj1;//错误!!!!因为不同类

1、使用类的成员—-通过对象或指针

  • 在类的作用域外,成员只能通过对象或指针分别使用成员访问操作符 “.”或“->”来访问。这些操作符左边的操作数分别是一个类对象或指向类对象的指针。跟在操作符后面的成员名字必须在相关联的类的作用域中声明:
Class obj;//Class是一个类
Class *ptr = &obj;
ptr->member;//通过指针来访问
obj.member;//通过对象来访问
ptr->memfcn();
obj.menfcn();
  • 一些成员使用成员访问操作符来访问,另一些直接通过类使用作用域操作符(::)来访问。一般的数据或函数成员必须通过对象来访问。定义类型的成员,如 Screen::index,使用作用域操作符来访问。

2、成员在类外定义—-加上类作用域,指明属于哪个类

  • 尽管成员是在类的定义体之外定义的,但成员定义就好像他们是在类的作用域中一样.出现在类的定义体之外的成员定义必须指明成员出现在哪个类中,写上类作用域运算符
double Sale_item::avg_price() const{//在类外定义的成员函数,必须指明函数名的作用域 Sale_item::

  if(units_sold)
    return revenue/units_sold;//因为指明了是在Sale_item类中,函数体就不需要指明类作用域了,所以不必写this->revenue
   else
    return 0;

}

3、类外定义的成员函数,形参和函数体属于类作用域范围—-形参和函数体不需要加类作用域

  • 在定义类外部的成员函数中,形参表和成员函数都出现在成员名之后,这些都是在类作用域中定义,所以可以不用限定而引用其他成员。
char Screen::get(index r,index c)const{

  index row=r*width;
  return contents[row+c];
}
 // 该函数用Screen内定义的index类型来指定其形参类型。因为形参表是在Screen类的作用域内,所以不必指明我们想要的是Screen::index。我们想要的是定义在当前类作用域中的,这是隐含的。同样,使用index、width和contents时指的都是Screen类中声明的名字,所以不需要指明作用域"Screen::"

4、类外定义的成员函数,函数返回类型不一定在类作用域中,所以,有些必须指明返回类型的类作用域

  • 与形参类型相比,返回类型出现在成员名字前面,如果函数在类定义体之外定义,则用于返回类型的名字在类作用域之外,返回类型前面必须加上类作用域。

  • 如果返回类型使用由类定义的类型,则必须使用完全限定名。

class Screen{
public:
   typedef std::string::size_type index;
   index get_cursor() const;
};
inline Screen::index Screen::get_cursor() const
{
  return cursor;
}
//函数返回类型是index,这是这Screen类内部定义的一个类型名。如果在类定义体之外定义get_cursor,则在函数名被处理之前,代码不在类作用域内。所以必须用完全限定的类型名Screen::index来指定所需要的index是在类Screen中定义的名字。

最后

以上就是俊逸小懒猪为你收集整理的C++12.3 类作用域(上)----需不需要加类作用域运算符 (类名: :)的全部内容,希望文章能够帮你解决C++12.3 类作用域(上)----需不需要加类作用域运算符 (类名: :)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部