《C++ Primer》关于 reference 和 pointer 部分看的人“生气”

2022-03-15 12:13:14 +08:00
 vcfghtyjc

对 C++一直是一知半解。最近正式的重读《 C++ Primer 》,不知道为什么看到 reference 和 pointer (章节:2.3 )莫名的生气。

不理解当初设计 C++的人多喜欢“&” 和 “*” 这两个符号。为什么不同功能要用同样的符号啊?!"&" 放在定义处代表引用,放到定义过的变量前代表取地址。键盘上那么多符号,就不能换个符号吗?当初大学 C++学的不好这个设计要背一半的锅。😂

7304 次点击
所在节点    C++
64 条回复
fgwmlhdkkkw
2022-03-15 13:02:37 +08:00
@Mohanson 哈哈哈哈哈哈
dongcidaci
2022-03-15 13:03:58 +08:00
冷静一下,其实你会发现也没有那么难理解
jasonkayzk
2022-03-15 13:23:01 +08:00
杰哥:我看你是完全不懂喔~( doge
freeup
2022-03-15 13:31:51 +08:00
最近我也在看 C++这本书 对于这块感觉还好 还是满能接受的 估计是因为之前 C#中使用简单的指针操作也是这两个符号吧
crackhopper
2022-03-15 13:39:08 +08:00
python 的**在行参和实参,行为还不一样呢。。当然还是 C++更变态点,建议汇编水平高了,结合编译的汇编来看,帮忙加深理解。

我个人觉得 C++难以理解的有 memory_order...反正看 cpp reference 只会看晕,还涉及缓存可见、缓存一致。模板我学得也比较差,大概皮毛吧,主要不写库没空搞,也就掌握到 reference collapse 和一些实例化流程方面了解一点。abi 也不够了解,我个人觉得 abi 问题可以用汇编解决,但也没去深入研究过。链接机制虽然知道,但没有在源码层面有了解。elf 格式了解的也比较皮毛。我觉得基本 c/c++还是要配合汇编、操作系统、CPU 、GPU 等等一起学,加深理解。如果用不上这些,也没必要用 c/c++,其他语言更方便。
crackhopper
2022-03-15 13:46:40 +08:00
当然,如果 C++比较熟练,其实写起来也挺快的。一般自己都会积累常用的轮子和自己造的轮子。适用于特定领域。
按照 linus 的说法是,C++很可能不同人掌握的深入不一样,会有大量的沟通成本。因为 c++一些行为是隐式的,所以他更推崇 c 。有一定道理,但 c 写起来会麻烦点,需要把轮子重新造一遍。可能 c++最大的问题就是如何控制参与项目的人所掌握的深度,和开发中所使用的深度。(毕竟:C++ makes it harder to shoot yourself, but when you do it blows your whole leg off )
如果只是应用层级的开发,不涉及硬件,不设计高性能计算,换语言更好吧,毕竟即使不同人掌握的深度深浅不一也不会造成太大的灾难。
dongfang
2022-03-15 13:47:39 +08:00
你说的引用符号是不会出现混淆的。
因为是声明的时候用,int& 是引用。
指针是这样子,int*。
完全不会混淆。
上面都是声明的时候,作为声明的类型。
&作为一目运算符,是取地址。
&作为两目运算符,是按位与。
*作为一目运算符,是对指针取值。
*做为两目运算符,是乘法。
也不会混淆,绝大多数情况下,语义是明确的。
可能出现混淆的时候,要加括号,比如
a*(*ptr)。这样别人也很容易看出,第一个*是乘法,第二个是对指针取值。
C++里面&和*的多重的语义,我个人是感觉没问题的。
反倒是,像 golang 里面的 switch 的多重语义放在一起,我感觉不是很好。
另外,如果你觉得引用类型声明的时候,不用&这个符号,你想用键盘上的哪个呢?
int$这样子,还是 int@这样子?感觉都挺丑的,还不如 int&。
SingeeKing
2022-03-15 13:51:25 +08:00
@Mohanson #1 perl 不服 [手动狗头]
newmlp
2022-03-15 13:52:48 +08:00
引用其实就是指针,不过就是个语法上有区别
dongfang
2022-03-15 14:03:40 +08:00
再多说一点,*和&混用,一般也不会混淆。
比如,
int* & a = ptr;
这里的 a 是对指针类型 int*的引用。
int& * a; 这个是无法编译的。
不能定义一个指向引用的指针。
dongfang
2022-03-15 14:13:41 +08:00
还有一点,从语义上,引用和指针没有任何关系。
引用是引用,指针是指针。
编译器在底层可以通过指针去实现引用这个功能,但是这并不是标准的规定。
从语义上,引用是取一个变量的别名,指针是内存中的地址。
所以,引用可以在内存中没有地址,一种很简单的思路,
就比如 int& a = b;
直接用#define a b 来实现。
也不是不可以。只不过这没法实现引用的其他功能。
dongfang
2022-03-15 14:19:37 +08:00
如果你在语义上,无法区分引用和指针。
那后面的左值引用、右值引用,移动语义就搞不明白了。
有了这些东西能避免很多时候的拷贝开销。
用指针也可以实现这些优化,但是太繁琐了,不够现代
Tianqi
2022-03-15 16:07:20 +08:00
C++为了兼容 C 语言和向后兼容做了很多妥协
wffnone
2022-03-15 16:17:21 +08:00
你生气发帖的时候,别人已经学下一节了。
fpure
2022-03-15 16:33:41 +08:00
C 语言的变量声明的规则类似模式匹配,C++的引用显然违背了这个规则
exonuclease
2022-03-15 17:41:43 +08:00
cpp 控制的东西太细节了所以符号看起来乱七八糟的 不过至少同样的功能 c#的语法好看一点
public struct Point3D
{
private static Point3D origin = new Point3D(0,0,0);
public static ref readonly Point3D Origin => ref origin; // static const Point3D& Origin = origin;
}
cybird
2022-03-15 17:45:02 +08:00
?????
指针是指针、引用是引用、右值是右值、左值是左值、表达式是表达式。
GeruzoniAnsasu
2022-03-15 17:46:41 +08:00
@hhjuteman 我 tm 直接按着编译器的头让它吐个报错来告诉我(恼
exonuclease
2022-03-15 17:54:15 +08:00
@exonuclease 好久不写 cpp 好像写错了 这里应该只有声明 static const Point3D& Origin
leirenbb
2022-03-15 19:26:52 +08:00
那你还能说 c++不如都搞成指针 再加上 gc 之类的。不要玩什么栈变量呢🤣

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/840451

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX