赞
踩
::(作用域运算符)和.(成员运算符)的区别
这是在看::运算符的作用时产生的疑问。::有三个作用:
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++,对其不熟悉造成的。然而折腾了这么久,也算是有点收获。
总结:.运算符用于对象对其类的成员进行调用。而;;运算符是类使用的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。