为什么想系统了解C++语言的内容
学习过程中的困扰
中文跟英文有巨大的区别,计算机语言又都是用的英文,这很容易导致同样的概念用中文翻译过来之后的就让人晕头转向。
比如C++ Primer Plus中文版,从第2章涉及到C++程序开始,cout就没翻译清楚。首先英文版刚开始介绍cout时就用括号标注了读音(pronounced"see-out"),中文翻译视而不见,简单的东西硬是漏翻掉让人去猜;其次,cout在英文版里就对应两个词,object和facility,对C++来说是对象,对程序员来说是工具,但中文翻译却在初学者还没熟悉概念的时候,紧随其后蹦出一个cout函数概念,cout这玩意一会儿是对象,一会儿是工具,一会儿给翻成了函数,问题是后面详细介绍的时候又明确指出它是对象,这不禁让初学者困惑。如果翻译校订仔细,相信能发现这个错误:“seeing cout instead of the printf() function”被翻译成“看到cout函数(而不是printf()函数)时”,C语言中printf()确实是函数,但是C++中cout不是函数,用C++的语言来说它就是对象。其他地方这里就不举例了,建议如果看得仔细的话,可以配上英文版纸质或电子版。
所以,其实我们有必要去梳理下C++语言的设计逻辑,这样凭着自己的深层次的基础性理解,无论看中文还是英文,都不容易被带偏,毕竟尽信书不如无书,实践出真知,书本只是基础。
剖析思考C++语言
计算机语言其实跟人类的语言是类似的东西,毕竟都叫做语言。人类的语言也有千差万别,机器的语言也是一样,这很容易让人联想到圣经里的巴别塔,其实上帝不光让人类说不同的语言,也让万物之间不能沟通,人类向往天堂,且一直在建造通往天堂的巴别塔,可以说任重而道远。
华为鸿蒙的野心是做物联网时代万物互联的基础操作系统,允许我断章取义,真正能做到万物互联的是神而不是人。我们对未来还是充满信心,能做的要做的事情太多了。什么时候能用中文做操作系统底层架构那咱们就真牛了,咱也不用被汉化的知识整懵逼了。
回归正题:为了搞清楚C++语言,我们还是得从最底层的最基础也是最简单的逻辑去剖析理解。作为初学者我个人粗略认为,C++程序是由C++语言内置的词汇或者说预定义内容和程序员自定义的内容组成,当我询问AI可以这么理解吗?得到了更详细的解读:
你的理解基本正确,但可以更精确地分层表述。C++程序的构成确实可以看作语言内置词汇(预定义内容)与程序员自定义内容的交互,但需要进一步明确其层次关系和交互规则。以下是更系统的分析:
C++程序内容系统分析
1. 构成要素分类
(1) 语言内置词汇(预定义内容)
- 关键词(Keywords)
int
,if
,class
,template
等,不可被重定义或修改。 - 运算符(Operators)
+
,<<
,->
等,部分可重载(如operator+
),但核心语义固定。 - 特殊标识符(Reserved Identifiers)
main
,operator new
,typeid
等,具有标准规定的特殊行为。 - 字面量(Literals)
42
,"hello"
,nullptr
等,语法形式固定。 - 预处理器符号
#define
,#include
等,在编译前处理。
(2) 程序员自定义内容
- 标识符(Identifiers)
变量名(count
)、函数名(calculate
)、类名(MyClass
)等。 - 运算符重载
自定义operator+
等,但必须遵循语言规定的重载规则。 - 类型系统扩展
通过class
/struct
定义新类型,或通过typedef
/using
创建类型别名。 - 宏(谨慎使用)
#define MAX 100
,但可能污染命名空间。
2. 二者的交互逻辑
graph LR
A[语言内置词汇] -->|提供基础规则| B[程序员自定义内容]
B -->|遵循| C[语法约束]
B -->|扩展| D[新功能]
A -->|限制| B
(1) 依赖关系
- 自定义内容必须基于内置词汇的规则
例如:class MyClass { // 使用关键词`class` int value; // 使用内置类型`int` void print() const; // 使用`const`修饰符 };
(2) 扩展机制
- 有限度的自由
- 可重载运算符,但不能创建新运算符(如不能定义
**
表示幂运算)。 - 可定义新类型,但必须通过已有类型组合(如
class
/enum
)。
- 可重载运算符,但不能创建新运算符(如不能定义
(3) 边界控制
自定义行为 | 语言限制 | 示例 |
---|---|---|
定义变量名 | 不能与关键词冲突 | int class; ❌ |
重载运算符 | 必须保留原始优先级和结合性 | a + b 永远先于 a << b |
实现main 函数 |
必须符合标准签名 | int main(int, char*[]) ✅ |
3. 设计哲学体现
(1) 约束与自由的平衡
-
约束性规则(保证可预测性)
int x = 42; // 类型必须明确(或通过`auto`推导) x = "hello"; ❌ // 禁止隐式类型不匹配赋值
-
扩展性自由(支持领域特定设计)
class Matrix { public: Matrix operator*(const Matrix& rhs); // 自定义矩阵乘法 };
(2) 显式优于隐式
- 自定义内容需显式声明:
explicit Data(int bytes); // 禁止隐式转换 override void draw(); // 显式标记覆盖
(3) 零开销抽象
- 自定义类型与内置类型性能等价:
std::array<int, 100> arr; // 编译时确定大小,与内置数组性能