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中定义的名字。
相关文章推荐
- [LeetCode] Single Number
- C++中namespace的使用
- c++ 读取全部txt文件内容到数组
- [LeetCode] Path Sum II
- C/C++ Technical Notes
- [LeetCode] Rotate List
- C++之多态性与虚函数
- [C/C++]_[VS2010来源与UTF8中国字符串转码ANSI问题]
- C++中正确使用PRId64
- 为什么我希望用C而不是C++来实现ZeroMQ(第二篇)
- <Effective C++>读书笔记-3
- 为什么我希望用C而不是C++来实现ZeroMQ
- C/C++预处理运算符
- C语言预处理运算符详解
- C++第八章
- C++12.2 隐含的this指针(不懂)、mutable数据成员
- 【leetcode c++】21 Merge Two Sorted Lists
- 【leetcode c++】 20 Valid Parentheses
- C++基础概念
- 知乎C++问题整理