C++语言的设计和演化——读后感

发布时间 2024-01-06 14:31:35作者: 静塘花开

C++的原始理念:

(1)应当具有Simula那样的对cheche那样的对程序组织的支持——类、某种形式的类分层结构、对并发的某种形式的支持、对基于类的类型系统的强(静态)检查

(2)产出的程序应该能运行的像BCPL一样快,将分别编译后的程序单元组合成完整程序应该向BCPL一样简单有效,将多种语言写成的程序单元组合成完整程序时的连接规则应当足够简单

(3)应该允许高度可移植的实现,移植时不需要复杂的运行支持系统,在工具和其宿主操作系统之间应该只有非常有限的集成

1、尊重人群而不尊重人群中的个体实际上就是什么也不尊重

历史上的某些灾难起因于理想主义者试图强迫人们"做某些对他们最好的事情",此种理想注意不仅导致了对无辜受害者的伤害,同样会迷惑或腐化施展权利的理想主义者们。此外,对于其教义或理论出现不寻常的冲突的经验和实验,理想主义者往往有忽略它们的倾向。

Bjarne Stroustrup提到希望给予程序员选择的权利,因此C++的许多设计决策根源于对强迫人按某种特定方式行事的极度厌恶。

2、仅根据理论和逻辑做决策是没有希望的

当试图取缔某个不喜欢的语言特征时,总会抑制住付诸行动的欲望,因为个人没有权利把个人观点强加给别人,即使通过强力推行逻辑、谴责"思想中坏的、过时的、混乱的习惯"极可能在相对短的时间里有更多的建树。

Bjarne Stroustrup通常希望是慢慢地(经常是令人痛苦的慢)推动人们去试验新的计数,接受那些适合他们需要或口味的东西,。

设计C++是为了解决某个问题,而非证明某种观点,而其成长又能够服务于它的使用者,完全可以通过逐步改变以达到进步,因此C++被有意设计为能够支持各种各样的风格,而非强调某条"真理之路"。

C With Class(未引入虚函数)

初期通过预处理程序实现,以C语言作为子集,仅需描述新特性(C语言中不具备的特性),其基础要求如下:

1、C With Class应当能用在C可以使用的任何地方

即意味着需要与C具备相当的执行效率,因此C With Class不应该为了去掉C语言中"危险"或"丑陋"特性而付出效率上的代价。

2、C With Class应该在运行时间、代码紧凑性、数据紧凑性等方面与C相媲美

如为保证数据布局方面与C的兼容性、并避免额外空间代价,类对象中没有存放任何"内务数据"

在此时C With Class仍被视为C的"方言",而非另一种语言,而类被称为抽象数据类型机制

C With Class(引入虚函数)

1、遵循Simula的方式,由程序员来描述类型,一个类就是一种类型

2、用户定义类型的变量作为类定义的部分。即意味着不一定使用堆内存以及垃圾回收机制,以实现用户定义类型的真正局部变量

3、通过编译时的访问控制限制对类成员的访问

4、对函数成员要描述完整的类型(包括返回类型、参数类型)以支持静态(编译时)的类型检查

5、函数的定义和声明往往分离,意味着更容易进行分别编译,传统的为C使用的连接计数即可支持C++

6、函数new()为建构函数,为类提供了必然调用来初始化所属类的各个对象的保证机制

7、同时提供了指针和非指针类型,同时允许指向用户定义类型和内部类型的指针

8、对象的分配支持三种形式:栈(作为自动对象)、静态区(静态对象)、自由存储区,与C不同的是,为自由存储区的分配和释放提供了new和delete运算符

C++设计准则:

1、提供一个特性是不够的,必须以一种实际上可以负担得起的形式来提供它(可以负担得起意味着使用常见硬件的开发者可以负担或若干年后硬件变得更便宜之后就可以负担)

2、唯一定义规则,每个函数、变量、类型、常量等都应该有且恰好有一个定义。如C++类型系统:按名字等价而非按结构等价,而结构布局相容性保证可以使用显示转换以提供低级的转换服务

3、C++仅是系统中的一个语言,而非一个完整的系统,不必去做那些语言不容易做的事情,因此要求C++程序片段能够调用其他语言写出另一个片段、C++程序片段同样可被用到其他语言写的程序片段所调用。此外C++的实现可以很容易的从其他语言写出的工具中获益

C++ protect的概念

1、保护是通过编译时机制提供的

2、访问权由类本身授予

3、访问权控制通过名字实行,并不依赖于被命名事物的种类

4、保护的单位是类,而不是个别的对象

5、受控制的是访问权,而非可见性

针对第五点示例如下(无论是否具备访问权,全局的val均会被A::val覆盖):

int val;

class A {
private:
    int val;
};

class B : public A
{
    void Func()
    {
        val = 0; // 'val' is a private member of 'A'
    }
};

 

C/C++兼容性问题&解决方法:

1、C中允许变量名与struct类型名相同,而C++中对C多名字空间的解决方法是:一个名字可以指称一个类,同时可以指称一个函数或者一个变量,除非某个名字同时指称这两者不同的东西,那么此名称指称的就是非类的东西,除非前面显示的加上关键字struct、union、class

int S;
struct S {
    int val;
};

void Func(struct S x)
{
    x.val = S;
}