🤖个人主页:晚风相伴-CSDN博客
思维导图链接:C++语言基础
持续更新中……
💖如果觉得内容对你有帮助的话,还请给博主一键三连(点赞💜、收藏🧡、关注💚)吧
🙏如果内容有误或者有写的不好的地方的话,还望指出,谢谢!!!
让我们共同进步
目录
1、C语言和C++的区别
2、struct和class的区别
3、C语言和C++结构体的区别
4、静态链接和动态链接
5、C语言和C++编译时的区别
6、static关键字的作用
7、函数指针
8、静态变量什么时候初始化
9、野指针
10、内联函数和宏的区别
11、new和malloc的区别
12、指针和引用的区别
13、内存泄漏
14、热重载
1、C语言和C++的区别
- C语言是C++的子集,C++可以很好兼容C语言。此外C++又有很多新的特性,如引用、智能指针等等
- C++是面向对象的编程语言,C语言是面向过程的编程语言
- C语言有一些不安全的语言特性,如指针使用的潜在危险、强置类型转换的不确定性、内存泄漏等,C++对此增加了不少新特性来改善安全性,如引用、智能指针、try-catch异常等。
- C++复用性高,C++引入了模板和STL库相比于C语言更灵活、更通用
2、struct和class的区别
- struct一般用于描述一个数据结构集合,而class是对一个对象数据的封装
- struct中默认的访问控制权限是public,而class中默认的访问控制权限是private
- 在继承关系中,struct默认是公有继承,而class默认是私有继承
- class可以用于定义模板参数,而struct不能
3、C语言和C++结构体的区别
- C语言的结构体内不允许有函数的存在,C++允许有内部成员函数,且允许该函数是虚函数
- C的结构体内部成员变量的访问权限只能是public,而C++允许public、protected、private。
- C语言的结构体是不可以继承的,C++的结构体是可以从其他结构体或类继承过来的
- C语言中使用结构体需要加上struct关键字,而C++则可以省略该关键字
4、静态链接和动态链接
静态链接,是在链接的时候就已经把要调用的函数或者过程链接到了生成的可执行文件中。Windows下以.lib为后缀,Linux下以.a为后缀
动态链接,是在代码运行过程中,再去找要链接的函数。Windows下以.dll为后缀,Linux下以.so为后缀。
5、C语言和C++编译时的区别
因为C++支持函数重载,所以在编译时不仅仅是函数名,还会将函数的参数类型也加到编译后的代码中;C语言不支持重载,所以在编译时一般只包括函数名
6、static关键字的作用
- 定义全局静态变量和局部静态变量,在变量前加static。初始化的静态变量会在数据段分配内存,未初始化的静态变量会在BSS段分配内存。只不过全局静态变量和局部静态变量的作用域不一样。
- 定义静态函数和静态变量,静态函数和静态变量只能在本源文件中使用
- 定义类中的静态成员变量和静态成员函数。类中的所有成员变量拥有一块单独的存储区,而不管创建了多少个该类的对象。所有这些对象的静态数据成员都共享这一块静态存储空间
- C++中规定,静态成员函数中没有this指针,因为它不属于任何一个对象
7、函数指针
- 函数指针就是指向函数的指针变量。每一个函数都有一个入口地址,该入口地址就是函数指针所指的地址
- 定义 int func(int a); int (*f)(int a); f = &func;
- 应用场景:回调
8、静态变量什么时候初始化
对于C语言的全局和静态变量,初始化发生在任何代码执行之前,属于编译期初始化。
C++标准规定,全局或静态对象当且仅当对象首次用到时才进行构造
9、野指针
- 野指针就是指针指向的位置是不可知的
- 产生原因:释放内存后指针没有及时置空,依然指向了该内存,那么可能出现非法访问的错误。
- 避免办法:初始化置NULL、申请内存后判空、指针释放后置NULL、使用智能指针
10、内联函数和宏的区别
- 宏定义不是函数,内联本质上是一个函数
- 宏定义在预编译的时候就把所有宏名来替换,而内联函数是在编译时进行代码插入,并且在调用的地方将内容展开,这样可以省去函数调用的开销,提高效率
- 宏定义没有类型检查,而内联函数会进行类型检查
11、new和malloc的区别
- new是操作符,而malloc是函数
- new在调用时先分配内存,再调用构造函数,释放时调用析构函数,而malloc没有构造函数和析构函数
- malloc需要给定申请内存的大小,返回时的指针需要强转;new会调用构造函数,不用指定内存的大小,返回指针不用强转
- new可以被重载,malloc则不行
- new分配内存更直接和安全
- new会抛异常,malloc则会返回NULL
12、指针和引用的区别
空值:指针可为空,引用必须指向有效对象
初始化:指针使用前可未初始化,但引用必须初始化
可变性:指针可重新指向不同的对象,引用一旦绑定则不可变
类型检查:指针类型相对宽松,引用类型严格
内存占用:指针占用固定大小内存,引用不额外占用
多级:指针可多级,引用只能一级引用的底层还是用的指针,所以引用也是会占内存的
13、内存泄漏
简单地说就是申请了一块内存空间,使用完毕后没有释放掉。
(1)new和malloc申请资源使用后,没有用delete和free释放
(2)子类继承父类,父类析构函数不是虚函数
(3)Windows句柄资源使用后没有释放
内存泄漏检测
①良好的编码习惯,使用了内存分配的函数,一旦使用完毕,要记得使用其相应的函数释放掉
②将分配的内存的指针以链表的形式自行管理,使用完毕之后从链表中删除,程序结束可检查该链表
③使用智能指针
④使用一些工具,如ccmalloc、Dmalloc、Leaky、Valgrind等等。
14、热重载
允许开发人员在不重启应用程序的情况下动态地加载、更新或替换代码的技术