读《C++ Primer》之定义、声明、引用

C++ Primer

C++ Primer

工作以来,我用过不少的编程语言,它们分别用在不同的技术场景中,比如用在企业应用中后台逻辑的 Java,用于数据库存储过程的 PL/SQL。但一直遗憾的是,没有工作机会采用 C/C++。日子一久,在学校里积攒的那点儿三脚猫 C++ 功夫就荒废了。这些系统级编程语言使用经验的缺失,使得我在理解底层问题时感到非常困难。自2013年初以来,我在空闲时间通过重新阅读《C++ Primer》一书,弥补遗忘的 C++ 知识,希望能够补上这个短板。本篇博客即是我在阅读时的思考,既做为自己的读书笔记,也供其他人参考和批判。

定义 VS 声明

变量提供了程序可以操作的有名字的存储区。每一个变量都有特定的类型,该类型决定了变量的内存大小和布局、能够存储于该内存中的值的取值范围以及可应用在变量上的操作集。

我弄不懂,这算不算是强类型(Strong Typing)与弱类型(Weak Typing)语言的区别之一。

在使用变量之前,变量必须已经被定义或声明。但是变量必须且仅能定义一次,定义时,除了可以为变量分配存储空间,还可以指定初始值。

C++ 中,声明(declaration)用于向程序表明变量的类型和名字。通过使用 extern 关键字,声明变量名而不定义它,不分配存储空间。事实上,它只是说明变量定义在程序的其他地方。

如果声明有初始化式,那么它可被当作是定义,即使声明标记为 extern。

在全局作用域里定义非 const 变量,它在整个程序中都可以访问。但是,在全局作用域声明的 const 变量是定义该对象的文件的局部变量,只存在于那个文件,不能被其他文件访问。

如果想要在在整个程序中访问 const 变量,则需要通过指定 const 变量为 extern。

引用

引用(reference)是对象的另一个名字,是一种复合类型(compound type),通过在变量名前添加“&”符号来定义,主要用作函数的形式参数。–复合类型(compound type)是指用其它类型定义的类型。

C++ 中,引用不能定义引用类型的引用(有点儿拗口),可以定义任何其他类型的引用,但必须用与该引用同类型的对象初始化。当引用初始化后,不能再将该引用绑定到另一个对象上。

非 const 引用只能绑定到与该引用同类型的对象。const 引用是指向 const 对象的引用,可以读取但不能修改对象的值,可以绑定到不同但相关的类型的对象或绑定到右值。

我认为,Java 中没有类似 Const 引用的概念,是一个缺憾,尽管 final 可以保证形参不再被赋值,但不能保证形参的值被修改。

引用形参与所有引用一样,直接关联到其所绑定的对象上,而并非这些对象的副本。调用函数时,引用形参被创建并与相应实参关联。

如果使用引用形参的唯一目的是避免复制实参,则应将形参定义为 const 引用。这样普通的非 const 引用形参也可以调用该函数。否则,调用这样的函数时,传递一个右值或具有需要转换的类型的对象同样是不允许的。

Leave a comment

Your comment