A First Impression

第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在不应该改变的内容之前。