C语言程序设计--编程语言启蒙

C语言

面向对象VS面向过程

面向对象: 以功能来划分问题,把构成问题的事务分解成一个个对象,每个对象都有自己的属性和方法,对象之间通过方法来交互。(Java:执行效率低,安全性高,【少了显示的指针调用、内存释放回收,这些交给了JVM,还有越界检测和空指针保存避免了不安全】)
面向过程: 以事件为中心,分析解决问题的步骤,用函数实现这些步骤,再按顺序调用函数。(C语言:执行效率高)
注意:32位编译器指针变量占4B,64位占8位

解释 VS 编译

编译:将源代码经过分析后生成语法树,再优化生成中间代码,最后生成机器码。编译的结果是生成一个可执行的二进制文件;
解释:将源代码经过分析后生成语法树,只不过此后它是基于语法树生成字节码,再根据字节码去执行程序。它并不会生成目标文件,更多的是一个结果。
(1)编译程序会产生目标程序;而解释程序不产生目标程序;
(2)编译程序实现起来比较复杂;而解释程序本身实现起来比较简单;
(3)编译程序效率比较高;而解释程序运行效率比较低,需对语法、词法、语义等进行检测;

纯函数VS虚函数

纯函数:独立的函数,不改变也不依赖于它作用域以外的变量。
虚函数:没有实现的,可由子类继承并重写的函数。

基本数据类型

局部变量VS全局变量

函数内引用使用的是局部变量

面向对象程序设计的三个基本特征

①封装。将事物封装成抽象的类,让自己的属性和方法只让可信的类或对象操作,对不可信的进行隐藏。
②继承。不用重写就可以使用现有类的功能并拓展。
③多态。同一操作作用于不同的对象,会产生不同的执行结果。

指针VS引用

指针:变量,存储的是地址,指向内存的一个存储单元;指针可以为空;指针可有多级;函数返回多个值,某些值就只能通过指针返回;传入数组后对数组做操作;需要传入较大的数据时用作参数;动态申请内存。数组变量本身表达地址;
引用:也是原变量;不可以为空,创建需初始化;只有一级。

*(p + n) = a[n]

0地址

NULL

二进制文件读写VS文本文件读写

二进制文件读写:内存中数据直接写入文本。
文本文件读写:数据先转换成字符串,再写入文本。

const VS #define

const: 编译阶段进行替换,会进行语法检查。
#define:预处理阶段进行替换,不会进行语法检查。
指针是const:表示一旦得到了某个变量的地址,不能再指向其他变量
所指是const:表示不能通过这个指针去修改那个变量(并不能使得那个变量成为const)

const与 define的区别主要体现在以下几个方面:

  • 编译器处理方式。const在编译时确定值,而define在预处理阶段进行文本替换。const有明确的数据类型,编译器会进行类型检查,而define没有数据类型,只是进行简单的字符串替换,没有类型安全检查。

  • 存储方式。const定义的变量会占用存储空间,而define定义的宏在编译后不占用内存空间。

  • 调试能力。const定义的常量可以被调试,而define定义的宏常量不能被调试。

  • 作用域。const定义的对象具有全局性或局部性,取决于其定义的位置,而define定义的宏在预处理阶段展开,其作用范围仅限于当前文件。

  • 重定义能力。define可以通过#undef取消某个符号的定义后重定义,而const不能重定义。

  • 使用场景。const适用于需要定义只读变量的场景,特别是在类中定义常量时;define适用于需要定义编译期间的常量或简单的文本替换场景。

C++

不安全:0既是布尔类型的false,也是int中的0.

static

修饰局部变量时,变量只初始化一次,每次调用都不重新赋值;
修饰全局变量和函数时,使之都只在当前源文件有效,不会再让其他源文件使用。

传参方式

传值、传地址、引用

#include <> VS #include " "

#include <>:系统自带文件,使之能在系统文件目录下查找。
#include " ":用户自定义文件,先在用户目录下查找,再在C++安装目录查找,最后再系统文件查找。

野指针

随机指向内存中某个位置,可能会导致地址泄露。因此我们要将指针初始化,指向NULL。不使用时free清空其内存空间。

C语言重载

C语言本身不支持函数重载,因为C语言是一种过程式,不面向对象即不需要重载,但也可以通过宏定义来定义不同参数的函数来实现。

STL

是C++标准库重要组成部分,提供了容器、算法、函数对象等模板类,使编程更高效。

vector

是STL中的容器,是一个可以动态扩展的数组,支持随机访问和迭代器等操作。

构造函数 VS 析构函数

构造函数:类名相同的成员函数,无返回类型,可以有参数也可以没有,对象创建后自动调用。
析构函数:没有参数和返回类型,在销毁对象时自动调用。

基类的析构函数为什么是虚函数

如果基类析构函数不是虚函数,基类指针指向子类对象,delete基类指针,调用基类析构函数,不会调用子类析构函数,会造成内存泄漏。

内联函数

在函数定义头部加上关键字inline,内联函数可以减少CPU开销,使运行速度更快,但只适用较小的函数。

静态成员函数、内联函数、构造函数不能声明为虚函数

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值