《C++沉思录》学习笔记1

本文探讨了C++相对于C语言的核心优势,主要集中在类的使用上。通过示例展示了如何使用类来实现跟踪输出功能,并逐步改进以支持关闭输出和输出到不同设备。文章指出,类使得状态管理和行为绑定更加方便,有利于后期维护和修改,而C语言中这种功能的实现可能需要更多全局变量和代码修改。最后,文章强调了C++面向对象编程在代码组织和可维护性方面的优越性。
摘要由CSDN通过智能技术生成


前言

作为高级语言,C已经很强大了,能够处理许多问题。

但是为什么还需要C++,C++出现的理由是什么,C++相比于C强大的核心本质在哪里?

一、类

#include<stdio.h>
class Trace{
public:
	void print(char*s){printf("%s",s);}
};
int main(){
    Trace t;
    t.print("begin main()\n");
    t.print("end main()\n");
}
  1. C++的核心概念是类。如上所示,定义了一个Trace类,用来实现跟踪输出的功能。
  2. 但是,上述代码所示的类,起到的作用并不大,我直接printf作用是相同的,甚至效率可能更好。

二、改进,实现关闭跟踪输出的功能

#include<stdio.h>
class Trace{
public:
    Trace(){noisy=0;}
	void print(char*s){if(noisy)printf("%s",s);}
    void on(){noisy=1;}//开启输出
    void off(){noisy=0;}//关闭输出
private:
    int noisy;
};
int main(){
    Trace t;
    t.print("begin main()\n");
    t.print("end main()\n");
}
  1. 在改进后的代码中,加入了私有成员noisyvoid on()void off()两个函数实现关闭和开启跟踪输出功能。
  2. 这个改进就有了很大的变化。如果我在程序中写了多次跟踪输出,遍布程序各个位置。当我不需要跟踪输出时,我可以使用void off()函数来实现。倘若不是这样,而是在程序中直接使用printf()函数的话,我将要搜索程序,大面积更改程序内容。

三、改进,实现跟踪输出到不同设备的功能

#include<stdio.h>
class Trace{
public:
    Trace(){noisy=0;f=stdout;}
    Trace(FILE* ff){noisy=0;f=ff;}
    //实现输出到不同设备,printf(args)与fprintf(stdout,atgs)等效
	void print(char*s){
        if(noisy){
            fprintf(f,"%s",s);
        }
    }
    void on(){noisy=1;}//开启输出
    void off(){noisy=0;}//关闭输出
private:
    int noisy;
    FILE* f;
};
int main(){
    Trace t(stderr);
    t.print("begin main()\n");
    t.print("end main()\n");
}
  1. 在上面的改进中,我们实现了输出到不同设备的功能。
  2. 倘若我们没有使用类,而是直接使用的fprintf(),那么就很难实现输出到不同设备的更改了。或许定义一个变量FILE* 然后要输出的不同设备时更改这个变量就行了,但是这样就很难实现不同代码段输出到不同设备的功能。而类只需要生成不同的类对象。

四、不用类来实现上述功能

#include<stdio.h>
static int noisy=1;
void trace(char*s){
    if(noisy){printf("%s",s);}
}
void on(){noisy=1;}//开启输出
void off(){noisy=0;}//关闭输出
int main(){
    trace("begin main()\n");
    trace("end main()\n");
}
  1. 函数trace()不是内联的,使用它会有函数调用开销。
  2. 引入了四个全局变量trace、on、off、noisy。而使用类只产生一个全局变量。
  3. 很难实现将上述跟踪输出到不同的文件中。一个可能的实现方式是将trace增加一个参数,改成void trace(FILE* ff,char* s)。但是这样,如果以前前期没有考虑到,就需要更改大量的前期代码,或者写一个新函数trace_out()。

C++优秀的面向对象的核心本质

  1. C++使用类来存储辅助的状态信息,比如noisy,比如FILE。这方便后期的修改和维护。
  2. 对于C,倾向于不添加状态信息,而是在前期就规划好,这会造成后期维护苦难。
  3. C++将通过使用对象,将状态和动作进行绑定。所以就实现了具体到是谁做了什么动作,这个谁就具有自己的状态信息,根据状态信息完成不同的动作。

参考资料

[1]凯尼格. C++沉思录[M]. 北京 : 人民邮电出版社, 2002

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值