第3章:C++的初次印象 #
在本章中,我们将进一步探索C++。通过各种示例展示了在结构体中声明函数的可能性;引入了类的概念;详细讨论了类型转换;介绍了许多新类型,并讨论了C的几个重要符号扩展。
3.1:与C的显著差异 #
在我们继续进行面向对象编程之前,我们首先介绍一些与C编程语言的显著差异:不仅是C和C++之间的差异,还有一些在C中找不到或使用不同的重要的语法结构和关键字。
3.1.1:使用const关键字
尽管const关键字是C语法的一部分,但它在C++中的使用更加重要、更常见,并且在C++中比在C中更严格。
const关键字是一个修饰符,表明一个变量或参数的值可能不会被修改。在以下示例中,意图是改变变量ival的值,但会失败:
int main() {
int const ival = 3; // 一个常量int,初始化为3
ival = 4; // 分配产生错误消息
}
此示例显示了如何在定义中将ival初始化为给定值;不允许稍后(在分配中)更改该值。
与C相比,声明为const的变量可以用来指定数组的大小,如下例所示:
int const size = 20;
char buf[size]; // 20个字符大小
const关键字的另一个用途是在指针声明中,例如在指针参数中。在声明
char const *buf;
buf是一个指针变量,指向字符。通过buf指向的任何内容都不能通过buf改变:字符被声明为const。然而,指针buf本身可以被改变。因此,像*buf = 'a';
这样的语句是不允许的,而++buf
是允许的。
声明
char *const buf;
buf本身是一个const指针,不能被改变。buf指向的任何字符都可以随意更改。
最后,声明
char const *const buf;
也是可能的;在这里,指针和它指向的内容都不能被改变。
关键字const的放置规则如下:在关键字左侧出现的任何内容都不能被改变。
尽管这条规则很简单,但它经常被使用。例如,Bjarne Stroustrup在( https://www.stroustrup.com/bs_faq2.html#constplacement)上说:
我应该把const放在类型之前还是之后? 我把它放在前面,但这只是个人口味问题。const T和T const始终(两者)都是允许的,并且等价。例如:
const int a = 1; // 可以
int const b = 2; // 也可以
我猜使用第一个版本会让更少的程序员感到困惑(更具惯用性)。
但我们已经看到了一个例子,其中应用这个简单的前置规则const会产生意想不到的(即不需要的)结果,就像我们很快会看到的(下面)。此外,`惯用性’前置放置也与const函数的概念相冲突,我们将在7.7节中遇到。在const函数中,关键字const也放在函数名称之后,而不是之前。
定义或声明(无论是包含const还是不包含const)应该始终从变量或函数标识符向后读取到类型标识符:
Buf是一个指向const字符的const指针。
这个规则在可能会引起混淆的情况下特别有用。在其他地方发布的C++代码示例中,人们经常遇到相反的情况:const在不应该改变的内容之前。