Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我应该选择点(.)还是箭头(>;)运算符来访问C++;?_C++_Oop_Pointers - Fatal编程技术网

C++ 我应该选择点(.)还是箭头(>;)运算符来访问C++;?

C++ 我应该选择点(.)还是箭头(>;)运算符来访问C++;?,c++,oop,pointers,C++,Oop,Pointers,与我一样,对于指针p,有两种访问引用对象成员的等效方法,即p->foo和(*p).foo 是否有最好使用的技术论据 注意:我读到的一个论点是,更安全,因为它不能重载,而->可以。但是,我猜想,必须有更多的参数,就像我在大多数C++代码中所做的那样,我只看到了 >代码> >构造> < /p> 对于原始指针,运算符不能被重载。 对于智能指针,运算符*也可以重载,并应返回与运算符->相同的对象(尽管已取消引用) 操作符->的可读性比将所有内容都用括号括起来要好得多,尤其是当您要在一行中多次使用它时 虽

与我一样,对于指针
p
,有两种访问引用对象成员的等效方法,即
p->foo
(*p).foo

是否有最好使用的技术论据


注意:我读到的一个论点是,
更安全,因为它不能重载,而
->
可以。但是,我猜想,必须有更多的参数,就像我在大多数C++代码中所做的那样,我只看到了<代码> >代码> >构造> < /p> 对于原始指针,运算符不能被重载。 对于智能指针,
运算符*
也可以重载,并应返回与
运算符->
相同的对象(尽管已取消引用)

操作符->
的可读性比将所有内容都用括号括起来要好得多,尤其是当您要在一行中多次使用它时


虽然
操作符->
是链接的(
操作符->
在返回的对象上被调用,并且可以再次重载),但是
操作符*
不是链接的,但是出现这样的情况是不寻常的,即这将导致不同的结果。

对于原始指针,操作符不能重载

对于智能指针,
运算符*
也可以重载,并应返回与
运算符->
相同的对象(尽管已取消引用)

操作符->
的可读性比将所有内容都用括号括起来要好得多,尤其是当您要在一行中多次使用它时


虽然
操作符->
是链式的(
操作符->
在返回的对象上被调用,并且可以再次重载),但是
操作符*
不是链式的,但是这种情况下会以不同的结果结束是不常见的。

通常,这两种方法都做相同的事情:

p->member
(*p).member
除了重载运算符以获得特殊行为的情况

至于哪个“更好”,这取决于更好意味着什么。。。
p->member
更简洁,代码更容易理解,这是一大优势

举一个更复杂的例子:

struct NewType
{
   int data;
}

void foo (NewType **p)
{
   int temp0 = (*p)->data;
   int temp1 = (*(*p)).data;
}

temp0
temp1
都具有相同的值,但是更容易看到
temp0
的情况一般来说,这两种方法都做相同的事情:

p->member
(*p).member
除了重载运算符以获得特殊行为的情况

至于哪个“更好”,这取决于更好意味着什么。。。
p->member
更简洁,代码更容易理解,这是一大优势

举一个更复杂的例子:

struct NewType
{
   int data;
}

void foo (NewType **p)
{
   int temp0 = (*p)->data;
   int temp1 = (*(*p)).data;
}

temp0
temp1
都具有相同的值,但要想了解
temp0
的情况要容易得多,因为
*
也可能过载。不要相信你读到的所有内容。你会没事的。这是一个固执己见的问题,没有真正的答案。只需继续编码并自行决定,但如果您决定在任何地方执行
(*p).foo
都更具可读性,那么您就错了;-)@ServéLaurijssen我要求提供技术参数(正如我在说明中给出的)。例如,可重载性是一个硬事实。我认为适当的事实是我要用的软的决定。<代码> */COM>也可以超载。不要相信你所读的一切。你会没事的。这是一个固执己见的问题,没有真正的答案。只需继续编码并自行决定,但如果您决定在任何地方执行
(*p).foo
都更具可读性,那么您就错了;-)@ServéLaurijssen我要求提供技术参数(正如我在说明中给出的)。例如,可重载性是一个硬事实。我认为适当的事实,我会用软的决定。