数组名隐式转换为指针时是右值还是不可修改的左值

slowgrace 2009-10-09 09:19:16
数组名隐式转换为指针时是右值还是不可修改的左值?

这两天和supermegaboy就这个问题讨论了好久(在这里),索性重新开个帖来讨论。

据supermegaboy说,标准中规定是右值。

可是来看看著名的Girlrong的说法:下面总结一下数组的数组名的问题。声明了一个数组TYPE array[n],则数组名称array就有了两重含义:第一,它代表整个数组,它的类型是TYPE [n];第二,它是一个指针,该指针的类型是TYPE*,该指针指向的类型是TYPE,也就是数组单元的类型,该指针指向的内存区就是数组第0号单元,该指针自己占有单独的内存区,注意它和数组第0号单元占据的内存区是不同的该指针的值是不能修改的,即类似array++的表达式是错误的。

楼下的觉得哪一种对?
...全文
2766 355 打赏 收藏 转发到动态 举报
写回复
用AI写文章
355 条回复
切换为时间正序
请发表友善的回复…
发表回复
auvmonkey 2011-09-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 slowgrace 的回复:]
引用 9 楼 pcboyxhy 的回复:
因为变量名不占据存储空间
所以无法获得变量名的地址

int abc;
&abc 是变量名abc引用的内容的地址,不是abc的地址


这个说法第一次听说
[/Quote]
pcboyxhy说的是对的
wuyuwww 2011-06-04
  • 打赏
  • 举报
回复
我考,顶,我正在啊看左值右值
slowgrace 2009-10-22
  • 打赏
  • 举报
回复
谢谢各位朋友,尤其是飞雪、pcboyxhy, pmerOFc, supermegaboy, hpsmouse等。

准备结帖了,帖子很长,分数有限,聊表谢意。其实各位朋友也不会很在意这些分,重在讨论和分享。

认真分配分数是为了后来者看到这个帖子的时候,通过查看“得分的回复”,就可以看到最有价值的回复(当然我的判断可能失之偏颇)。

我把对我有启发的回复都或多或少给了分,有些回复的观点我不一定赞同,但是我觉得也有启发,所以也给了分。我自己的回复有些也很好,但不能给自己分,呵呵。

这个帖子的部分内容小结在这个帖子里:http://topic.csdn.net/u/20091020/15/425ceedc-afff-4af1-a298-6466914c1d2d.html

过几天我还会贴其他的小结,现在尚在整理中,谢谢关注。
ahao 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 351 楼 slowgrace 的回复:]
引用 350 楼 ahao 的回复:
说实在的,我觉得弄明白这个用处不大,我写c/c++N年,从没遇到一次需要考虑这个问题的


恩 所以我其实也要求很低 没有去搬大部头去钻研 只是和朋友们讨教一下就罢……
[/Quote]

你的总结还是很有用的,这个东西在一些模板库的编写里还是需要考虑的。没想到想在还有人提到girlrong:)
slowgrace 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 350 楼 ahao 的回复:]
说实在的,我觉得弄明白这个用处不大,我写c/c++N年,从没遇到一次需要考虑这个问题的
[/Quote]

恩 所以我其实也要求很低 没有去搬大部头去钻研 只是和朋友们讨教一下就罢……
ahao 2009-10-22
  • 打赏
  • 举报
回复
说实在的,我觉得弄明白这个用处不大,我写c/c++N年,从没遇到一次需要考虑这个问题的
slowgrace 2009-10-22
  • 打赏
  • 举报
回复
16楼,28楼,77楼都是很有启发的回复,谢谢两位。

再看这个帖子中:
[Quote=引用 122 楼 supermegaboy 的回复:]
没错。普通对象与数组体现的是两种不同的抽象方法,但目的都是一样的,都为了更容易地操作内存。
[/Quote]

这些回复并在一起看,可以互相印证和纠正。

谢谢pcboyxhy,飞雪和supermegaboy。
slowgrace 2009-10-22
  • 打赏
  • 举报
回复
自己回答一下347楼的疑惑。在28楼飞雪提出pcboy的说法中不大经得起推敲的地方,小结一下我的理解:
(1)16楼的说法是用汇编实现来解释语法现象,因和果弄反了;
(2)16楼的说法里把变量名等同于地址(在汇编实现里是这样的),这种说法并不是和标准一致的说法,还是按28楼那样去理解变量及变量名比较好。依循标准可以避免一些麻烦。
(3)16楼的说法很好地说明了数组这种对象和普通对象在操作上的不同,所以其实也回答了飞雪在77楼提出要思考的问题,虽然用词不够考究(有点混淆了汇编实现和语法概念)。
slowgrace 2009-10-22
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 pcboyxhy 的回复:]
比较一下,两种设计
一,a表示地址常量引用的内容,&a表示地址常量本身
二,a表示地址常量本身,value(a)表示这个地址常量引用的内容

方案二更加符合习惯,因为人们习惯用简单的东西表示本质,然后加一些提取方式,通过它获得更多,
就像句柄一样,通过它去访问它所能引用到的信息。

但是方案二在普通变量上使用起来不方便,因为大部分时候,我们并不关心本质,甚至基本用不到本质,
99%的时候只关心它引用的东西,所以干脆简化一下,默认就表示它引用的东西,当需要取得本质,
就需要通过手段了,也就是&。

在对待数组上,恰好相反,如果把数组名默认解释成它引用的内容,那么取哪一个元素好呢?
其它的元素怎么办? 所以数组上采用了第二种方案,即默认不去引用数组名的地址常量标识的内容,
而是直接表示地址常量。当需要引用这个地址常量标识的内存中的数组元素时,再采取间接方式。

包括label在内,一切名字皆地址常量,类型的意义在于选择解析这个常量的方式。
[/Quote]

[Quote=引用 77 楼 baihacker 的回复:]
整数可以加减乘除.(虽然可能会出现意外)
浮点数也可以加减乘除.
布尔变量可以有真假值.

这一切摆出来,人们当然认为是天然的.

当有人并不认为这是天然的,这就是天才了.

伽罗华,群论,把这些集合,及其上面的关系抽象出来...于是在很多教材上提到伽罗华的时候都加了天才(我看的那本是)

这个集合内部的元素上可以有什么操作?
元素间有什么操作?
操作是封闭的吗?
和其它集合的元素有什么关系?

把这些问题重新问一次就明白了.

数组作为一个元素,我们能有什么操作?
整数作为一个元素,我们能有什么操作?

思考这两个问题...
[/Quote]

这两个发言都在试图解释为何数组标识符的相关语法是那样设计的,我觉得都有道理
lanseshenhua 2009-10-20
  • 打赏
  • 举报
回复
简单的看了下,我个人比较同意pcboyxhy的说法。楼主要是有时间就看看《Compilers: Principles, Techniques, and Tools 》这本书,好像有中文版的(第二版)。前面的词法语法分析就不用看,可以看从符号表那开始看。看完后你就能明白这些问题了。汇编是探究语言底层秘密的有效武器。
taozi1234567 2009-10-20
  • 打赏
  • 举报
回复
数组名只是数组的标识符,不是左值,不能给他赋值,他只是进入方括号语法的手段。可以把他看作数组起始处 的只读指针。(C++编程思想!)
2009-10-20
  • 打赏
  • 举报
回复
[Quote=引用 340 楼 slowgrace 的回复:]
引用 314 楼 baihacker 的回复:
7 Whenever an lvalue appears in a context where an rvalue is expected, the lvalue is converted to an rvalue;
see 4.1, 4.2, and 4.3.
飞雪,这是C++标准吧?
[/Quote]
飞雪一向都是 C++ ~~
slowgrace 2009-10-20
  • 打赏
  • 举报
回复
[Quote=引用 314 楼 baihacker 的回复:]
7 Whenever an lvalue appears in a context where an rvalue is expected, the lvalue is converted to an rvalue;
see 4.1, 4.2, and 4.3.
[/Quote]

飞雪,这是C++标准吧?
Arkwyd 2009-10-20
  • 打赏
  • 举报
回复
对标题问题,记下我的理解。

一般而言,一个 lvalue ,指一个符号所代表的地址;一个 rvalue ,指一个符号所代表的地址的内容。

char a[10];
char *p;
p = a;

以上,a 赋给 p ,p 拿到的是 a 所代表的地址,而不是 a 所代表的地址的内容。此时的 a 表达的是一个 lvalue 所代表的意义。需注意,这里的 a 的 lvalue 是一个不可改变的 lvalue ,所以说“数组名‘是’一个地址常量”。

参考:《expert c programming: deep secrets》Chapter 4. The Shocking Truth: C Arrays and Pointers
Are NOT the Same!

“我参与,我自豪。”
slowgrace 2009-10-20
  • 打赏
  • 举报
回复
[Quote=引用 341 楼 hpsmouse 的回复:]
引用 340 楼 slowgrace 的回复:
引用 314 楼 baihacker 的回复:
7 Whenever an lvalue appears in a context where an rvalue is expected, the lvalue is converted to an rvalue;
see 4.1, 4.2, and 4.3.
飞雪,这是C++标准吧?

飞雪一向都是 C++  ~~
[/Quote]

谢谢鼠。
gbyjrp 2009-10-20
  • 打赏
  • 举报
回复
建议参考一下《c专家编程》一书对数组和指针之间区别的论述!!!!!
jinwei1984 2009-10-16
  • 打赏
  • 举报
回复
这贴真火
slowgrace 2009-10-16
  • 打赏
  • 举报
回复
由衷地谢谢各位 洗洗睡了 希望今晚睡梦中能把这些纠结的理清楚
pmerOFc 2009-10-16
  • 打赏
  • 举报
回复
1.没有任何证据说那个“男人”存在
2.没有任何证据显示“变性”的痕迹

但凭借最后结果给出了一个符合逻辑的幻想过程
这恰恰给奥卡姆剃刀以必然的意义

说多了
无他
当有人讲我概念错误或逻辑错误时
只要有机会
我总要出来说点什么
pmerOFc 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 335 楼 supermegaboy 的回复:]
我再打个比喻,一个男人通过变性变成了女人,这是一个男人converted to女人的过程,但如果把它理解成了男人is女人,不是荒谬么?他就是犯了这样一个逻辑错误。
[/Quote]
作为CODER
你只是看到了一个女人而已
你根本没有看到converted to的过程
也永远没有这样的机会
你只是听标准这样说过而已
而且很可能是误听
这个男人对你来说是不存在的
认为你所看见的一个女人是由一个虚无的男人通过你所没看见的变性变成
在我看来不但虚幻也多此一举
如果这种虚幻被容许
那么同样可以说这个男人变过2n+1次性
逻辑上没有丝毫漏洞

加载更多回复(335)
C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。 对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。 目录 第1章 开始 1   1.1 编写一个简单的C++程序 2   1.1.1 编译、运行程序 3   1.2 初识输入输出 5   1.3 注释简介 8   1.4 控制流 10   1.4.1 while语句 10   1.4.2 for语句 11   1.4.3 读取数量不定的输入数据 13   1.4.4 if语句 15   1.5 类简介 17   1.5.1 Sales_item类 17   1.5.2 初识成员函数 20   1.6 书店程序 21   小结 23   术语表 23   第Ⅰ部分 C++基础 27   第2章 变量和基本类型 29   2.1 基本内置类型 30   2.1.1 算术类型 30   2.1.2 类型转换 32   2.1.3 字面值常量 35   2.2 变量 38   2.2.1 变量定义 38   2.2.2 变量声明和定义的关系 41   2.2.3 标识符 42   2.2.4 字的作用域 43   2.3 复合类型 45   2.3.1 引用 45   2.3.2 指针 47   2.3.3 理解复合类型的声明 51   2.4 const限定符 53   2.4.1 const的引用 54   2.4.2 指针和const 56   2.4.3 顶层const 57   2.4.4 constexpr和常量表达式 58   2.5 处理类型 60   2.5.1 类型别 60   2.5.2 auto类型说明符 61   2.5.3 decltype类型指示符 62   2.6 自定义数据结构 64   2.6.1 定义Sales_data类型 64   2.6.2 使用Sales_data类 66   2.6.3 编写自己的头文件 67   小结 69   术语表 69   第3章 字符串、向量和数组 73   3.1 命空间的using声明 74   3.2 标准库类型string 75   3.2.1 定义和初始化string对象 76   3.2.2 string对象上的操作 77   3.2.3 处理string对象中的字符 81   3.3 标准库类型vector 86   3.3.1 定义和初始化vector对象 87   3.3.2 向vector对象中添加元素 90   3.3.3 其他vector操作 91   3.4 迭代器介绍 95   3.4.1 使用迭代器 95   3.4.2 迭代器运算 99   3.5 数组 101   3.5.1 定义和初始化内置数组 101   3.5.2 访问数组元素 103   3.5.3 指针数组 105   3.5.4 C风格字符串 109   3.5.5 与旧代码的接口 111   3.6 多维数组 112   小结 117   术语表 117   第4章 表达式 119   4.1 基础 120   4.1.1 基本概念 120   4.1.2 优先级与结合律 121   4.1.3 求值顺序 123   4.2 算术运算符 124   4.3 逻辑和关系运算符 126   4.4 赋值运算符 129   4.5 递增和递减运算符 131   4.6 成员访问运算符 133   4.7 条件运算符 134   4.8 位运算符 135   4.9 sizeof运算符 139   4.10 逗号运算符 140   4.11 类型转换 141   4.11.1 算术转换 142   4.11.2 其他隐式类型转换 143   4.11.3 显式转换 144   4.12 运算符优先级表 147   小结 149   术语表 149   第5章 语句 153   5.1 简单语句 154   5.2 语句作用域 155   5.3 条件语句 156   5.3.1 if语句 156   5.3.2 switch语句 159   5.4 迭代语句 165   5.4.1 while语句 165   5.4.2 传统的for语句 166   5.4.3 范围for语句 168   5.4.4 do while语句 169   5.5 跳转语句 170   5.5.1 break
C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛的C++经典教程,其内容是C++大师Stanley B. Lippman丰富的实践经验和C++标准委员会原负责人Josée Lajoie对C++标准深入理解的完美结合,已经帮助全球无数程序员学会了C++。 对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。 目录 第1章 开始 1   1.1 编写一个简单的C++程序 2   1.1.1 编译、运行程序 3   1.2 初识输入输出 5   1.3 注释简介 8   1.4 控制流 10   1.4.1 while语句 10   1.4.2 for语句 11   1.4.3 读取数量不定的输入数据 13   1.4.4 if语句 15   1.5 类简介 17   1.5.1 Sales_item类 17   1.5.2 初识成员函数 20   1.6 书店程序 21   小结 23   术语表 23   第Ⅰ部分 C++基础 27   第2章 变量和基本类型 29   2.1 基本内置类型 30   2.1.1 算术类型 30   2.1.2 类型转换 32   2.1.3 字面值常量 35   2.2 变量 38   2.2.1 变量定义 38   2.2.2 变量声明和定义的关系 41   2.2.3 标识符 42   2.2.4 字的作用域 43   2.3 复合类型 45   2.3.1 引用 45   2.3.2 指针 47   2.3.3 理解复合类型的声明 51   2.4 const限定符 53   2.4.1 const的引用 54   2.4.2 指针和const 56   2.4.3 顶层const 57   2.4.4 constexpr和常量表达式 58   2.5 处理类型 60   2.5.1 类型别 60   2.5.2 auto类型说明符 61   2.5.3 decltype类型指示符 62   2.6 自定义数据结构 64   2.6.1 定义Sales_data类型 64   2.6.2 使用Sales_data类 66   2.6.3 编写自己的头文件 67   小结 69   术语表 69   第3章 字符串、向量和数组 73   3.1 命空间的using声明 74   3.2 标准库类型string 75   3.2.1 定义和初始化string对象 76   3.2.2 string对象上的操作 77   3.2.3 处理string对象中的字符 81   3.3 标准库类型vector 86   3.3.1 定义和初始化vector对象 87   3.3.2 向vector对象中添加元素 90   3.3.3 其他vector操作 91   3.4 迭代器介绍 95   3.4.1 使用迭代器 95   3.4.2 迭代器运算 99   3.5 数组 101   3.5.1 定义和初始化内置数组 101   3.5.2 访问数组元素 103   3.5.3 指针数组 105   3.5.4 C风格字符串 109   3.5.5 与旧代码的接口 111   3.6 多维数组 112   小结 117   术语表 117   第4章 表达式 119   4.1 基础 120   4.1.1 基本概念 120   4.1.2 优先级与结合律 121   4.1.3 求值顺序 123   4.2 算术运算符 124   4.3 逻辑和关系运算符 126   4.4 赋值运算符 129   4.5 递增和递减运算符 131   4.6 成员访问运算符 133   4.7 条件运算符 134   4.8 位运算符 135   4.9 sizeof运算符 139   4.10 逗号运算符 140   4.11 类型转换 141   4.11.1 算术转换 142   4.11.2 其他隐式类型转换 143   4.11.3 显式转换 144   4.12 运算符优先级表 147   小结 149   术语表 149   第5章 语句 153   5.1 简单语句 154   5.2 语句作用域 155   5.3 条件语句 156   5.3.1 if语句 156   5.3.2 switch语句 159   5.4 迭代语句 165   5.4.1 while语句 165   5.4.2 传统的for语句 166   5.4.3 范围for语句 168   5.4.4 do while语句 169   5.5 跳转语句 170   5.5.1 break语句 170   5.5.2 continue语句 171   5.5.3 goto语句 172   5.6 TRY语句块和异常处理 172   5.6.1 throw表达式 173   5.6.2 try语句块 174   5.6.3 标准异常 176   小结 178   术语表 178   第6章 函数 181   6.1 函数基础 182   6.1.1 局部对象 184   6.1.2 函数声明 186   6.1.3 分离式编译 186   6.2 参数传递 187   6.2.1 传值参数 187   6.2.2 传引用参数 188   6.2.3 const形参和实参 190   6.2.4 数组形参 193   6.2.5 main:处理命令行选项 196   6.2.6 含有可变形参的函数 197   6.3 返回类型和return语句 199   6.3.1 无返回值函数 200   6.3.2 有返回值函数 200   6.3.3 返回数组指针 205   6.4 函数重载 206   6.4.1 重载与作用域 210   6.5 特殊用途语言特性 211   6.5.1 默认实参 211   6.5.2 内联函数和constexpr函数 213   6.5.3 调试帮助 215   6.6 函数匹配 217   6.6.1 实参类型转换 219   6.7 函数指针 221   小结 225   术语表 225   第7章 类 227   7.1 定义抽象数据类型 228   7.1.1 设计Sales_data类 228   7.1.2 定义改进的Sales_data类 230   7.1.3 定义类相关的非成员函数 234   7.1.4 构造函数 235   7.1.5 拷贝、赋值和析构 239   7.2 访问控制与封装 240   7.2.1 友元 241   7.3 类的其他特性 243   7.3.1 类成员再探 243   7.3.2 返回*this的成员函数 246   7.3.3 类类型 249   7.3.4 友元再探 250   7.4 类的作用域 253   7.4.1 字查找与类的作用域 254   7.5 构造函数再探 257   7.5.1 构造函数初始值列表 258   7.5.2 委托构造函数 261   7.5.3 默认构造函数的作用 262   7.5.4 隐式的类类型转换 263   7.5.5 聚合类 266   7.5.6 字面值常量类 267   7.6 类的静态成员 268   小结 273   术语表 273   第Ⅱ部 C++标准库 275   第8章 IO库 277   8.1 IO类 278   8.1.1 IO对象无拷贝或赋值 279   8.1.2 条件状态 279   8.1.3 管理输出缓冲 281   8.2 文件输入输出 283   8.2.1 使用文件流对象 284   8.2.2 文件模式 286   8.3 string流 287   8.3.1 使用istringstream 287   8.3.2 使用ostringstream 289   小结 290   术语表 290   第9章 顺序容器 291   9.1 顺序容器概述 292   9.2 容器库概览 294   9.2.1 迭代器 296   9.2.2 容器类型成员 297   9.2.3 begin和end成员 298   9.2.4 容器定义和初始化 299   9.2.5 赋值和swap 302   9.2.6 容器大小操作 304   9.2.7 关系运算符 304   9.3 顺序容器操作 305   9.3.1 向顺序容器添加元素 305   9.3.2 访问元素 309   9.3.3 删除元素 311   9.3.4 特殊的forward_list操作 312   9.3.5 改变容器大小 314   9.3.6 容器操作可能使迭代器失效 315   9.4 vector对象是如何增长的 317   9.5 额外的string操作 320   9.5.1 构造string的其他方法 321   9.5.2 改变string的其他方法 322   9.5.3 string搜索操作 325   9.5.4 compare函数 327   9.5.5 数值转换 327   9.6 容器适配器 329   小结 332   术语表 332   第10章 泛型算法 335   10.1 概述 336   10.2 初识泛型算法 338   10.2.1 只读算法 338   10.2.2 写容器元素的算法 339   10.2.3 重排容器元素的算法 342   10.3 定制操作 344   10.3.1 向算法传递函数 344   10.3.2 lambda表达式 345   10.3.3 lambda捕获和返回 349   10.3.4 参数绑定 354   10.4 再探迭代器 357   10.4.1 插入迭代器 358   10.4.2 iostream迭代器 359   10.4.3 反向迭代器 363   10.5 泛型算法结构 365   10.5.1 5类迭代器 365   10.5.2 算法形参模式 367   10.5.3 算法命规范 368   10.6 特定容器算法 369   小结 371   术语表 371   第11章 关联容器 373   11.1 使用关联容器 374   11.2 关联容器概述 376   11.2.1 定义关联容器 376   11.2.2 关键字类型的要求 378   11.2.3 pair类型 379   11.3 关联容器操作 381   11.3.1 关联容器迭代器 382   11.3.2 添加元素 383   11.3.3 删除元素 386   11.3.4 map的下标操作 387   11.3.5 访问元素 388   11.3.6 一个单词转换的map 391   11.4 无序容器 394   小结 397   术语表 397   第12章 动态内存 399   12.1 动态内存与智能指针 400   12.1.1 shared_ptr类 400   12.1.2 直接管理内存 407   12.1.3 shared_ptr和new结合使用 412   12.1.4 智能指针和异常 415   12.1.5 unique_ptr 417   12.1.6 weak_ptr 420   12.2 动态数组 423   12.2.1 new和数组 423   12.2.2 allocator类 427   12.3 使用标准库:文本查询程序 430   12.3.1 文本查询程序设计 430   12.3.2 文本查询程序类的定义 432   小结 436   术语表 436   第Ⅲ部分 类设计者的工具 437   第13章 拷贝控制 439   13.1 拷贝、赋值与销毁 440   13.1.1 拷贝构造函数 440   13.1.2 拷贝赋值运算符 443   13.1.3 析构函数 444   13.1.4 三/五法则 447   13.1.5 使用=default 449   13.1.6 阻止拷贝 449   13.2 拷贝控制和资源管理 452   13.2.1 行为像值的类 453   13.2.2 定义行为像指针的类 455   13.3 交换操作 457   13.4 拷贝控制示例 460   13.5 动态内存管理类 464   13.6 对象移动 470   13.6.1 右值引用 471   13.6.2 移动构造函数和移动赋值运算符 473   13.6.3 右值引用和成员函数 481   小结 486   术语表 486   第14章 操作重载与类型转换 489   14.1 基本概念 490   14.2 输入和输出运算符 494   14.2.1 重载输出运算符<> 495   14.3 算术和关系运算符 497   14.3.1 相等运算符 497   14.3.2 关系运算符 498   14.4 赋值运算符 499   14.5 下标运算符 501   14.6 递增和递减运算符 502   14.7 成员访问运算符 504   14.8 函数调用运算符 506   14.8.1 lambda是函数对象 507   14.8.2 标准库定义的函数对象 509   14.8.3 可调用对象与function 511   14.9 重载、类型转换与运算符 514   14.9.1 类型转换运算符 514   14.9.2 避免有二义性的类型转换 517   14.9.3 函数匹配与重载运算符 521   小结 523   术语表 523   第15章 面向对象程序设计 525   15.1 OOP:概述 526   15.2 定义基类和派生类 527   15.2.1 定义基类 528   15.2.2 定义派生类 529   15.2.3 类型转换与继承 534   15.3 虚函数 536   15.4 抽象基类 540   15.5 访问控制与继承 542   15.6 继承中的类作用域 547   15.7 构造函数与拷贝控制 551   15.7.1 虚析构函数 552   15.7.2 合成拷贝控制与继承 552   15.7.3 派生类的拷贝控制成员 554   15.7.4 继承的构造函数 557   15.8 容器与继承 558   15.8.1 编写Basket类 559   15.9 文本查询程序再探 562   15.9.1 面向对象的解决方案 563   15.9.2 Query_base类和Query类 567   15.9.3 派生类 568   15.9.4 eval函数 571   小结 575   术语表 575   第16章 模板与泛型编程 577   16.1 定义模板 578   16.1.1 函数模板 578   16.1.2 类模板 583   16.1.3 模板参数 592   16.1.4 成员模板 595   16.1.5 控制实例化 597   16.1.6 效率与灵活性 599   16.2 模板实参推断 600   16.2.1 类型转换与模板类型参数 601   16.2.2 函数模板显式实参 603   16.2.3 尾置返回类型与类型转换 604   16.2.4 函数指针和实参推断 607   16.2.5 模板实参推断和引用 608   16.2.6 理解std::move 610   16.2.7 转发 612   16.3 重载与模板 614   16.4 可变参数模板 618   16.4.1 编写可变参数函数模板 620   16.4.2 包扩展 621   16.4.3 转发参数包 622   16.5 模板特例化 624   小结 630   术语表 630   第Ⅳ部分 高级主题 633   第17章 标准库特殊设施 635   17.1 tuple类型 636   17.1.1 定义和初始化tuple 637   17.1.2 使用tuple返回多个值 638   17.2 BITSET类型 640   17.2.1 定义和初始化bitset 641   17.2.2 bitset操作 643   17.3 正则表达式 645   17.3.1 使用正则表达式库 646   17.3.2 匹配与Regex迭代器类型 650   17.3.3 使用子表达式 653   17.3.4 使用regex_replace 657   17.4 随机数 659   17.4.2 其他随机数分布 663   bernoulli_distribution类 665   17.5 IO库再探 666   17.5.1 格式化输入与输出 666   17.5.2 未格式化的输入/输出操作 673   17.5.3 流随机访问 676   小结 680   术语表 680   第18章 用于大型程序的工具 683   18.1 异常处理 684   18.1.1 抛出异常 684   18.1.2 捕获异常 687   18.1.3 函数try语句块与构造函数 689   18.1.4 noexcept异常说明 690   18.1.5 异常类层次 693   18.2 命空间 695   18.2.1 命空间定义 695   18.2.2 使用命空间成员 701   18.2.3 类、命空间与作用域 705   18.2.4 重载与命空间 708   18.3 多重继承与虚继承 710   18.3.1 多重继承 711   18.3.2 类型转换与多个基类 713   18.3.3 多重继承下的类作用域 715   18.3.4 虚继承 717   18.3.5 构造函数与虚继承 720   小结 722   术语表 722   第19章 特殊工具与技术 725   19.1 控制内存分配 726   19.1.1 重载new和delete 726   19.1.2 定位new表达式 729   19.2 运行类型识别 730   19.2.1 dynamic_cast运算符 730   19.2.2 typeid运算符 732   19.2.3 使用RTTI 733   19.2.4 type_info类 735   19.3 枚举类型 736   19.4 类成员指针 739   19.4.1 数据成员指针 740   19.4.2 成员函数指针 741   19.4.3 将成员函数用作可调用对象 744   19.5 嵌套类 746   19.6 union:一种节省空间的类 749   19.7 局部类 754   19.8 固有的不可移植的特性 755   19.8.1 位域 756   19.8.2 volatile限定符 757   19.8.3 链接指示:extern "C" 758   小结 762   术语表 762   附录A 标准库 765   A.1 标准库字和头文件 766   A.2 算法概览 770   A.2.1 查找对象的算法 771   A.2.2 其他只读算法 772   A.2.3 二分搜索算法 772   A.2.4 写容器元素的算法 773   A.2.5 划分与排序算法 775   A.2.6 通用重排操作 776   A.2.7 排列算法 778   A.2.8 有序序列的集合算法 778   A.2.9 最小值和最大值 779   A.2.10 数值算法 780   A.3 随机数 781   A.3.1 随机数分布 781   A.3.2 随机数引擎 783   C++11的新特性   2.1.1 long long类型 31   2.2.1 列表初始化 39   2.3.2 nullptr常量 48   2.4.4 constexpr变量 59   2.5.1 类型别声明 60   2.5.2 auto类型指示符 61   2.5.3 decltype类型指示符 62   2.6.1 类内初始化 65   3.2.2 使用auto或decltype缩写类型 79   3.2.3 范围for语句 82   3.3 定义vector对象的vector(向量的向量) 87   3.3.1 vector对象的列表初始化 88   3.4.1 容器的cbegin和cend函数 98   3.5.3 标准库begin和end函数 106   3.6 使用auto和decltype简化声明 115   4.2 除法的舍入规则 125   4.4 用大括号包围的值列表赋值 129   4.9 将sizeof用于类成员 139   5.4.3 范围for语句 168   6.2.6 标准库initializer_list类 197   6.3.2 列表初始化返回值 203   6.3.3 定义尾置返回类型 206   6.3.3 使用decltype简化返回类型定义   6.5.2 constexpr函数 214   7.1.4 使用=default生成默认构造函数 237   7.3.1 类对象成员的类内初始化 246   7.5.2 委托构造函数 261   7.5.6 constexpr构造函数 268   8.2.1 用string对象处理文件 284   9.1 array和forward_list容器 293   9.2.3 容器的cbegin和cend函数 298   9.2.4 容器的列表初始化 300   9.2.5 容器的非成员函数swap 303   9.3.1 容器insert成员的返回类型 308   9.3.1 容器的emplace成员的返回类型 308   9.4 shrink_to_fit 318   9.5.5 string的数值转换函数 327   10.3.2 Lambda表达式 346   10.3.3 Lambda表达式中的尾置返回类型 353   10.3.4 标准库bind函数 354   11.2.1 关联容器的列表初始化 377   11.2.3 列表初始化pair的返回类型 380   11.3.2 pair的列表初始化 384   11.4 无序容器 394   12.1 智能指针 400   12.1.1 shared_ptr类   12.1.2 动态分配对象的列表初始化 407   12.1.2 auto和动态分配 408   12.1.5 unique_ptr类 417   12.1.6 weak_ptr类 420   12.2.1 范围for语句不能应用于动态分配数组 424   12.2.1 动态分配数组的列表初始化 424   12.2.1 auto不能用于分配数组 424   12.2.2 allocator::construct可使用任意构造函数 428   13.1.5 将=default用于拷贝控制成员 449   13.1.6 使用=default阻止拷贝类对象 449   13.5 用移动类对象代替拷贝类对象 469   13.6.1 右值引用 471   13.6.1 标准库move函数 472   13.6.2 移动构造函数和移动赋值 473   13.6.2 移动构造函数通常应该是noexcept 473   13.6.2 移动迭代器 480   13.6.3 引用限定成员函数 483   14.8.3 function类模板 512   14.9.1 explicit类型转换运算符 516   15.2.2 虚函数的override指示符 530   15.2.2 通过定义类为final来阻止继承 533   15.3 虚函数的override和final指示符 538   15.7.2 删除的拷贝控制和继承 553   15.7.4 继承的构造函数 557   16.1.2 声明模板类型形参为友元 590   16.1.2 模板类型别 590   16.1.3 模板函数的默认模板参数 594   16.1.5 实例化的显式控制 597   16.2.3 模板函数与尾置返回类型 605   16.2.5 引用折叠规则 609   16.2.6 用static_cast将左值转换右值 612   16.2.7 标准库forward函数 614   16.4 可变参数模板 618   16.4 sizeof...运算符 619   16.4.3 可变参数模板与转发 622   17.1 标准库Tuple类模板 636   17.2.2 新的bitset运算 643   17.3 正则表达式库 645   17.4 随机数库 659   17.5.1 浮点数格式控制 670   18.1.4 noexcept异常指示符 690   18.1.4 noexcept运算符 691   18.2.1 内联字空间 699   18.3.1 继承的构造函数和多重继承 712   19.3 有作用域的enum 736   19.3 说明类型用于保存enum对象 738   19.3 enum的提前声明 738   19.4.3 标准库mem_fn类模板 746   19.6 类类型的联合成员 75

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧