类其实也是一种作用域,在类的作用域之外,普通的成员只能通过对象(可以是对象本身,也可以是对象指针或对象引用)来访问,静态成员既可以通过对象访问,又可以通过类访问。

这句话说得不错

类其实也是一种作用域,每个类都会定义它自己的作用域。在类的作用域之外,普通的成员只能通过对象(可以是对象本身,也可以是对象指针或对象引用)来访问,静态成员既可以通过对象访问,又可以通过类访问,而 typedef 定义的类型只能通过类来访问。

转载自:http://c.biancheng.net/view/vip_2234.html

类其实也是一种作用域

< C++友元函数和友元类 C++ class和struct的区别 >

 

类其实也是一种作用域,每个类都会定义它自己的作用域。在类的作用域之外,普通的成员只能通过对象(可以是对象本身,也可以是对象指针或对象引用)来访问,静态成员既可以通过对象访问,又可以通过类访问,而 typedef 定义的类型只能通过类来访问。

下面的例子使用不同的方式访问了不同的成员:

 
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. class A{
  5. public:
  6. typedef int INT;
  7. static void show();
  8. void work();
  9. };
  10. void A::show(){ cout<<"show()"<<endl; }
  11. void A::work(){ cout<<"work()"<<endl; }
  12.  
  13. int main(){
  14. A a;
  15. a.work(); //通过对象访问普通成员
  16. a.show(); //通过对象访问静态成员
  17. A::show(); //通过类访问静态成员
  18. A::INT n = 10; //通过类访问 typedef 定义的类型
  19.  
  20. return 0;
  21. }

定义在类外部的成员

一个类就是一个作用域的事实能够很好的解释为什么我们在类的外部定义成员函数时必须同时提供类名和函数名。在类的外部,类内部成员的名字是不可见的。

一旦遇到类名,定义的剩余部分就在类的作用域之内了,这里的剩余部分包括参数列表和函数体。结果就是,我们可以直接使用类的其他成员而无需再次授权了。请看下面的例子:

 
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. class A{
  5. public:
  6. typedef char* PCHAR;
  7. public:
  8. void show(PCHAR str);
  9. private:
  10. int n;
  11. };
  12. void A::show(PCHAR str){
  13. cout<<str<<endl;
  14. n = 10;
  15. }
  16.  
  17. int main(){
  18. A obj;
  19. obj.show("http://c.biancheng.net");
  20.  
  21. return 0;
  22. }

我们在定义 show() 函数时用到了类 A 中定义的一种类型 PCHAR,因为前面已经指明了当前正位于 A 类的作用域中,所以不用再使用A::PCHAR这样的冗余形式。同理,编译器也知道函数体中用到的变量 n 也位于 A 类的作用域。

另一方面,函数的返回值类型出现在函数名之前,当成员函数定义在类的外部时,返回值类型中使用的名字都位于类的作用域之外,此时必须指明该名字是哪个类的成员。修改上面的 show() 函数,让它的返回值类型为 PCHAR:

 
  1. PCHAR A::show(PCHAR str){
  2. cout<<str<<endl;
  3. n = 10;
  4. return str;
  5. }

这种写法是错误的。因为返回值类型 PCHAR 出现在类名之前,所以事实上它是位于 A 类的作用域之外的。这种情况下要想使用 PCHAR 作为返回值类型,就必须指明哪个类定义了它,正确的写法如下所示:

 
  1. A::PCHAR A::show(PCHAR str){
  2. cout<<str<<endl;
  3. n = 10;
  4. return str;
  5. }
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值