您的位置:首页 > 编程语言 > C语言/C++

C++12.3 类作用域(上)----需不需要加类作用域运算符 (类名: :)

2015-06-18 15:28 393 查看

简介

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

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

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

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

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

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

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

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

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

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

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

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

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

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

class First{
public:
   int 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中定义的名字。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: