C语言与C++中点运算符与箭头运算符的区别

来源:互联网 发布:非正式会谈oo的淘宝店 编辑:程序博客网 时间:2024/05/22 13:32

在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结构的地址指针。所以可以使用"->",而此时就不能使用
"."来操作。因为"." "相当于"对象的成员调用。

首先介绍一下C++中的结构。对于一个结构来说,
struct MyStruct {
int member_a;
};

如果有个变量MyStruct s,那么使用其中的成员元素时可以用
s.member_a = 1;

如果采用指针方法访问,比如MyStruct * ps,那么同样的访问必须用箭头号:

ps->member_a = 1;

::只用在类成员函数和类成员变量中。比如,声明一个类:

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 <string.h>

Song_t  song1,song2,                        //两个Song_t类型的对象

                *pSong = &song1;              //和一个指向Song_t的指针

 

strcpy(song1.composer,"Ottma Liebert");

song1.duration = 251;

song1.published.year = 1998;

if((*pSong).duration >180)

     printf("The song is more than 3 mimutes long.\n");

--最后一句也可以改写为:

if(pSong->duration > 180) ....

 

另外一点体会:如果一个函数的传入参数是结构体,且需要该结构体作为返回值的时候,必须采用指针传递的方式,其中对结构体赋值必须使用箭头运算符。

int  iSetValue(Song_t *pSong)

{

  strcpy( pSong ->composer,"123");

  pSong->duration = 251;

 ...

}

0 0