[引用自https://www.zhihu.com/question/19675440]
我感觉用不同的符号有这个作用:
1、对于程序员来说,知道自己用的是对象,还是指针,还是名字空间,特别是需要知道是指针,因为可能还要释放动态内存,这样提高程序的可读性。
2、对于编译器构造者来说,构造符号表和类型检查的时候,这三者的处理方式,和检查方式就不一样了,更有必要分开操作了
->和.用于对象成员,两者意义完全不同,p->a等价于(*p).a;::用于类成员
C++ 的设计原则之一是要和 C 兼容,而 C 就有 . 和 - >
简单来说,这三者大概都表示“的“的意思,.是结构体,对象用的;->是指针用的,::是类或者命名空间用的,用以区分。
举例:
在c++中I如果是对象,就可以通过"."来调用I中的成员变量。
如果I是指针的话,就不能通过"."来调用,而只能使用"->"来调用。
在C语言中不存在对象的概念。
这种情况的出现是因为使用了结构,例如
struct CandyBar{
float weight;
int calorie;
};
在程序中
CandyBar snack={
2.3,
350
};
我们就可以用
snack.weight
来取得结构中的值。
这时是不能使用"->"来调用的,"->"符号指针对指针来说的。
如下情况可以使用"->"
CandyBar* bird;
bird->weight=2.33;
此时bird为一个CandyBar结构的地址指针。所以可以使用"->",而此时就不能使用
"."来操作。因为"." "相当于"对象的成员调用。:只用在类成员函数和类成员变量中。比如,声明一个类:
class CA {
public:
int ca_var;
int add(int a, int b);
int add(int a);
};
那么在实现这个函数时,必须这样书写:
int CA::add(int a, int b)
{
return a + b;
}
另外,双冒号也常常用于在类变量内部作为当前类实例的元素进行表示,比如:
int CA::add(int a)
{
return a + ::ca_var;
}
表示当前类实例中的变量ca_var。
c++中当定义类对象是指针对象时候,就需要用到->指向类中的成员;当定义一般对象时候时就需要用到"."指向类中的成员.......
例如:
class A
{
public
play();
}
如果定义如下:
A *p则:p->play()使用; 左边是结构指针。
A p 则:p.paly()使用; 左边是结构变量。
::关于命名空间的用法:
#include <iostream>
using namespace std;
// 第一个命名空间
namespace first_space{
void func(){
cout << "Inside first_space" << endl;
}
}
// 第二个命名空间
namespace second_space{
void func(){
cout << "Inside second_space" << endl;
}
}
int main ()
{
// 调用第一个命名空间中的函数
first_space::func();
// 调用第二个命名空间中的函数
second_space::func();
return 0;
}