易码技术论坛

 找回密码
 加入易码
搜索
查看: 357661|回复: 3

[教程] [交作业]关于作用域操作符::的介绍

[复制链接]
发表于 2006-10-30 23:53:12 | 显示全部楼层
建议大家买老谭的《C++程序设计》深入浅出很容易懂,内容也很全面,而且不贵,36元,去大学的旧书店买半价,才18元~
发表于 2006-11-1 08:37:31 | 显示全部楼层
我说明明use namespace XXX了为什么还要使用::,原来是为了方便……汗^_^b
发表于 2006-11-1 08:39:20 | 显示全部楼层
引用第1楼starwing2006-10-30 23:53发表的“”:
建议大家买老谭的《C++程序设计》深入浅出很容易懂,内容也很全面,而且不贵,36元,去大学的旧书店买半价,才18元~
学C++最好看这些书
http://www.emsky.net/bbs/read.php?tid=18507
 楼主| 发表于 2006-10-22 22:38:49 | 显示全部楼层 |阅读模式
这周先拿这篇凑数把,写Demo写的没时间了……
Cloty在帖子里面问到的,于是总结了一下,如果有人发现还有补充,可以继续跟帖~
或者说得不对的地方也可以提出:)
引用第3楼Cloty2006-10-20 13:25发表的“”:
::
我一直不懂::这种表达法
简单的说,::就是“作用域操作符”,首先要有名字空间的概念。
比如写了这样一段代码:
  1. namespace MyApp
  2. {
  3.   void foo(){};
  4. }
  5. void global(){};
复制代码
这个foo函数是在MyApp这个名字空间下的,所以要用MyApp::foo来调用。
如果直接写::的话,表示全局的或者已经被使用的名字空间。
所以那个global函数可以写::global来调用,也可以不写::

假如有这样的代码
using namespace MyApp;
说明MyApp这个名字空间已经被设为使用中,调用时可以隐去。那么当MyApp里面的东西在名称不冲突的情况下,可以用::来调用,也可以不写。

一般情况下在最前面的::可以不写,之所以总是看到这样写的代码,我个人觉得是因为输入::后VC的智能感知可以将全局的东西都列出来。

当然作用域不一定就是名字空间,类定义中也常常用到。
  1. class Human
  2. {
  3.    class Arm
  4.    {
  5.       // code...
  6.    }
  7.    // code...
  8. }
复制代码
在class Human的类定义之外如果要用Arm也得写成Human::Arm,同样在类之外实现类的成员变量或者函数的时候也要如此。
比如类定义在这里:
  1. class Human
  2. {
  3.    void Action();
  4. };
复制代码
Aciton()的实现写在其他地方了,那么需要这样来写函数名称:
  1. void Human::Action()
  2. {
  3.    // do something
  4. }
复制代码
这样表示在这里实现的是Human这个类中的成员函数Action(),而不是一个全局的Aciton()。

还有调用一个类的静态成员函数或者成员变量的时候,也要用::,比如下面的:
  1. class SampleClass
  2. {
  3. public:
  4.    static const int id = 0;
  5. };
  6. void main()
  7. {
  8.    int a = SampleClass::id;
  9. }
复制代码
这里的SampleClass::id就像一个全局变量的感觉,当然静态成员的使用不是为了把全局变量搞成这副德性。

总结一下,所谓::表示后面的东西是属于前面的那个"域"的,"域"永远是抽象的,就像一个人的姓氏,这和.不一样,操作符.前面的是一个具体的东西,比如一某个类的实例。

题外话,貌似在c#里面,符号.也有作用域操作符的含义=v=

shooting的补充

子类要调用爸爸的成员,而自己有覆盖时,也要这么写:
  1. class A
  2. {
  3. public:
  4.   void f()
  5.   {
  6.     cout<<"Hello from A";
  7.   }
  8. };
  9. class B:public A
  10. {
  11. public:
  12.   void f()
  13.   {
  14.     A::f();
  15.     cout<<"Hello from B";
  16.   }
  17. };
复制代码
您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-26 13:40 , Processed in 0.010293 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表