::和.的区别

来源:互联网 发布:js字符串转数组 编辑:程序博客网 时间:2024/04/29 03:14

::(作用域运算符)和.(成员运算符)的区别


这是在看::运算符的作用时产生的疑问。::有三个作用:
1、全局作用

2、类作用

3、名称空间

1和3不多说,在2中,其说明是:

作用域符号::的前面一般是类名称,后面一般是该类的成员名称,C++为了避免不同的类有名称相同的成员而采用作用域的方式进行区分
  如:A,B表示两个类,在A,B中都有成员member。那么
  A::member就表示类A中的成员member
  B::member就表示类B中的成员member

成员也无非就是类中的数据成员和成员函数,我的疑问就来了。

类的对象调用成员函数是这样的:

A a;

a.member();

既然可以用A;;member;那么和a.member();有什么区别呢?

首先最直观的一点,一个是对象调用,一个是类调用。

但是不实例一个对象,而用类去调用函数,这样是可行的吗?

接下来写例子程序测试:

class A
{
public:
void fun()
{
  cout<<"this is A"<<endl;
}
};

class B
{
public:
void fun()
{
  cout<<"this is B"<<endl;
}
};

int main()

{

  A.a;

  a.fun();

  B::fun():

  return 0;

}

编译产生错误:没有对象无法调用成员函数void B::fun();

我就纳闷了,说好的::符号类作用呢?

再试试数据成员吧:

class A
{
public:
int nA;

};

class B
{
public:
int nB;
};

int main()
{
A a;
a.nA = 1;
B::nB = 2;
cout<<a.nA<<endl;
cout<<B::nB<<endl;
return 0;
}
编译产生错误::对非静态数据成员‘B::nB’的无效使用。

那这个::运算符的类作用是怎么用的?继续网上查资料,查到如下使用方法:
声明一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f的定义,那么在类外定义f时,就要写成void A::f(),表示这个f()函数是类A的成员函数。

class A
{
public:
  void fun();
};


void A::fun()
{
  cout<<"this is A"<<endl;
}


int main()
{
  A a;
  a.fun();
  return 0;
}

运行成功。

但是想不出这样做有什么意义。继续网上找答案,找到的解释是:

在类的内部对成员函数作声明,而在类体外定义成员函数,这是程序设计的一种良好习惯。如果一个函数,其函数体只有2-3行,一般可在声明类时在类体中定义。多于3行的函数,一般在类体内声明,在类外定义。这样可以使类的定义看起来更加清晰易懂。

问题解决了,但想想其实只是我刚学C++,对其不熟悉造成的。然而折腾了这么久,也算是有点收获。

总结:.运算符用于对象对其类的成员进行调用。而;;运算符是类使用的。


0 0