1.C中static有什么作用

(1)隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,故使用static在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。

(2)static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量。

(3)static的第三个作用是默认初始化为0。其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。在静态数据区,内存中所有的字节默认值都是0×00,某些时候这一特点可以减少程序员的工作量。

2.C++中const有什么用?

const修饰的内容不可改变。定义常量只是一种使用方式而已,还有const数据成员,const参数,const返回值,const成员函数等,被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

3.C与C++各自是如何定义常量的?有什么不同?

C中是使用宏#define定义, C++使用更好的const来定义。

区别:

1)const是有数据类型的常量,而宏常量没有,编译器可以对前者进行静态类型安全检查,对后者仅是字符替换,没有类型安全检查,而且在字符替换时可能会产生意料不到的错误(边际效应)。

2)有些编译器可以对const常量进行调试, 不能对宏调试。

既然C++中有更好的const为什么还要使用宏?

const无法代替宏作为卫哨来防止文件的重复包含。

4.C++中引用和指针的区别?

引用是对象的别名,操作引用就是操作这个对象,必须在创建的同时有效得初始化(引用一个有效的对象,不可为NULL),初始化完毕就再也不可改变,引用具有指针的效率,又具有变量使用的方便性和直观性,在语言层面上引用和对象的用法一样,在二进制层面上引用一般都是通过指针来实现的,只是编译器帮我们完成了转换。之所以使用引用是为了用适当的工具做恰如其分的事,体现了最小特权原则。

5.C与C++的内存分配方式?

1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,如全局变量,static变量。

2)在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

3)从堆上分配(动态内存分配)。程序在运行的时候用malloc或new申请任意多少的内存,程序员负责在何时用free或delete释放内存。动态内存的生存期自己决定,使用非常灵活。

补充:栈、堆的区别

一、堆栈空间分配区别:

1、栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈;

2、堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。

二、堆栈缓存方式区别:

1、栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;

2、堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

三、堆栈数据结构区别:

堆(数据结构):堆可以被看成是一棵树,如:堆排序;

栈(数据结构):一种先进后出的数据结构。

学习从来不是一个人的事情,要有个相互监督的伙伴,工作需要学习C/C++或者有兴趣学习C/C++的伙伴可以私信回复小编“学习”领取全套免费C/C++学习资料、视频

6.new/delete 与 malloc()/free() 的区别?

malloc()与 free()是C语言的标准库函数,new/delete 是C++的运算符,他们都可以用来申请和释放内存,malloc()和free()不在编译器控制权限之内,不能把构造函数和析构函数的任务强加给他们。

7. 在C++ 程序中调用被 C编译器编译后的函数,为什么要加 extern “C”?

C++语言支持函数重载,C语言不支持函数重载。

函数被C++编译后在库中的名字与C语言的不同。假设某个函数的原型为: void foo(int x, int y);该函数被C编译器编译后在库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字。C++提供了C连接交换指定符号extern”C”来解决名字匹配问题。

8. C++中的什么是多态性? 是如何实现的?

多态性是面向对象程序设计语言继封装和继承之后的第三个基本特征。

它是在运行时出现的多态性通过派生类和虚函数实现。基类和派生类中使用同样的函数名, 完成不同的操作具体实现相隔离的另一类接口,即把” w h a t”从”h o w”分离开来。多态性提高了代码的组织性和可读性,虚函数则根据类型的不同来进行不同的隔离。

9. 什么是动态特性?

在绝大多数情况下,程序的功能是在编译的时候就确定下来的,我们称之为静态特性。 反之,如果程序的功能是在运行时刻才能确定下来的, 则称之为动态特性。C++中,虚函数,抽象基类,动态绑定和多态构成了出色的动态特性。

10. 什么是封装?C++中是如何实现的?

封装来源于信息隐藏的设计理念,是通过特性和行为的组合来创建新数据类型让接口与具体实现相隔离。C++中是通过类来实现的,为了尽量避免某个模块的行为干扰同一系统中的其它模块,应该让模块仅仅公开必须让外界知道的接口。

11. 拷贝构造函数 & 深浅拷贝

拷贝构造函数是单个参数的构造函数,其参数是与它同属一类的对象的(常)引用;类定义中,如果未提供自己的拷贝构造函数,C++提供一个默认拷贝构造函数,该默认拷贝构造函数完成一个成员到一个成员的拷贝。

浅拷贝是创建了一个对象用一个现成的对象初始化它的时候只是复制了成员(简单赋值)而没有拷贝分配给成员的资源(如给其指针变量成员分配了动态内存);

深拷贝是当一个对象创建时,如果分配了资源,就需要定义自己的拷贝构造函数,使之不但拷贝成员也拷贝分配给它的资源。

12. 面向对象程序设计的优点?

开发时间短, 效率高, 可靠性高。面向对象编程的编码具有高可重用性,可以在应用程序中大量采用成熟的类库(如STL),从而虽短了开发时间,软件易于维护和升级。

13. strcpy实现

需要注意下面几点

(1)将源字符串加const,表明其为输入参数

(2)对源地址和目的地址加非0断言

(3)为了实现链式操作,将目的地址返回

char * strcpy( char *strDest, const char *strSrc )
{
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘\0’);
return address;
}

14. delete与 delete []区别

delete只会调用一次析构函数,而delete[]会调用每一个成员的析构函数。

在More Effective C++中有更为详细的解释:“当delete操作符用于数组时,它为每个数组元素调用析构函数,然后调用operator delete来释放内存。”delete与new配套,delete []与new []配套。

MemTest *mTest1=new MemTest[10];
MemTest *mTest2=new MemTest;
Int *pInt1=new int [10];
Int *pInt2=new int;
delete[]pInt1; //-1-
delete[]pInt2; //-2-
delete[]mTest1;//-3-
delete[]mTest2;//-4-

在-4-处报错。

这就说明:对于内建简单数据类型,delete和delete[]功能是相同的。

对于自定义的复杂数据类型,delete和delete[]不能互用。delete[]删除一个数组,delete删除一个指针。

简单来说,用new分配的内存用delete删除;用new[]分配的内存用delete[]删除。delete[]会调用数组元素的析构函数。内部数据类型没有析构函数,所以问题不大。如果你在用delete时没用括号,delete就会认为指向的是单个对象,否则,它就会认为指向的是一个数组。

15. 子类析构时要调用父类的析构函数吗?

析构函数调用的次序是先派生类的析构后基类的析构,也就是说在基类的的析构调用的时候,派生类的信息已经全部销毁了。

定义一个对象时先调用基类的构造函数、然后调用派生类的构造函数;析构的时候恰好相反:先调用派生类的析构函数、然后调用基类的析构函数。

16. 多态,虚函数,纯虚函数

多态:是对于不同对象接收相同消息时产生不同的动作。C++的多态性具体体现在运行和编译两个方面:在程序运行时的多态性通过继承和虚函数来体现;在程序编译时多态性体现在函数和运算符的重载上;

虚函数:在基类中冠以关键字 virtual 的成员函数。 它提供了一种接口界面。允许在派生类中对基类的虚函数重新定义。

纯虚函数的作用:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义。作为接口而存在 纯虚函数不具备函数的功能,一般不能直接被调用。

从基类继承来的纯虚函数,在派生类中仍是虚函数。如果一个类中至少有一个纯虚函数,那么这个类被称为抽象类(abstract class)。

抽象类中不仅包括纯虚函数,也可包括虚函数。抽象类必须用作派生其他类的基类,而不能用于直接创建对象实例。但仍可使用指向抽象类的指针支持运行时多态性。

17. 重载(overload)和重写(overried,有的书也叫做“覆盖”)的区别?

从定义上来说:

重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

重写:是指子类重新定义父类虚函数的方法。

从实现原理上来说:

重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:function func(p:integer):integer;和function func(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!

重写:和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑定)。

18. 引用与指针有什么区别?

1) 引用必须被初始化,指针不必。

2) 引用初始化以后不能被改变,指针可以改变所指的对象。

3) 不存在指向空值的引用,但是存在指向空值的指针。

最后如果大家对C/C++感兴趣的话,可以加一下我们的学习交流Q群:637935295,免费领取一套学习资料和视频课程哟~

18个C/C++的基本知识点,带好小本子记录一下相关推荐

  1. react只停留在表层?五大知识点带你梳理进阶知识

    五大知识点带你梳理react进阶知识 ✉️前言

  2. 计算机网络自考第一章知识点,完整版18版自考04741计算机网络原理知识点第一章...

    <完整版18版自考04741计算机网络原理知识点第一章>由会员分享,可在线阅读,更多相关<完整版18版自考04741计算机网络原理知识点第一章(5页珍藏版)>请在人人文库网上搜 ...

  3. 运行mbedtls自带Demo ssl_client的记录

    概述: 运行mbedtls自带  ssl demo的记录: 操作过程: 编译Demo,请看我专栏中的相关文章 先运行服务端程序,运行ssl_server.exe,运行结果如下: mbedtls-3.2 ...

  4. 全方位了解超宽带信号高速采集记录回放系统

    超宽带高速记录回放系统 超宽带信号高速采集记录存储回放系统主要用于对超宽带信号进行长时间高速连续实时采集记录和回放产生,适用于雷达.无线通信.软件无线电.电子对抗.电子侦察.卫星导航.复杂电磁环境模拟 ...

  5. 全方面的了解超宽带信号高速采集记录回放系统

    超宽带高速记录回放系统 超宽带信号高速采集记录存储回放系统主要用于对超宽带信号进行长时间高速连续实时采集记录和回放产生,适用于雷达.无线通信.软件无线电.电子对抗.电子侦察.卫星导航.复杂电磁环境模拟 ...

  6. mysql的条件求和函数_mysql 带条件取count记录数,SUM()函数按条件求和

    在做统计报表的时候,通常会用到一些复杂的统计功能,而不是简单的 count(*), sum(abc) 就可以的,这就用到了一些基于条件的统计功能. 带条件取count记录数 参考方法: 统计sub_t ...

  7. 商品详情页html代码获取,直播带货小程序源码中,商品详情页是如何获取html图片的...

    在搭建直播带货小程序源码过程中,需要为商品构建详情页,而商品页中的图片是要通过html获取并展示到本地的,那么这个过程是如何实现的?接下来小编将通过代码演示一下: 1.配置webView mWebVi ...

  8. 如何利用系统自带的小工具制作特殊字符

    Windows7自带的小工具很多,但是我们不经常用到,甚至不知道有这么一款软件.今天,就跟大家推荐一款很实用的字符编辑软件,能够很好的组合出极富有个性的字. 操作步骤 1打开Windows7自带的字符 ...

  9. win10计算机里的工具在哪里设置,win10系统桌面上添加自带日历小工具的设置办法...

    win10系统使用久了,好多网友反馈说关于对win10系统桌面上添加自带日历小工具设置的方法,在使用win10系统的过程中经常不知道如何去对win10系统桌面上添加自带日历小工具进行设置,有什么好的办 ...

最新文章

  1. 通用数据级别权限的框架设计与实现(3)-数据列表的权限过滤
  2. java使用httpclient封装post请求和get的请求
  3. ARCGIS知乎上的好文章
  4. Java基础回顾Application(二)
  5. Mybatis逆向工程(生成实体类)开发指南
  6. centOS 自动锁屏 解决办法
  7. LINUX下三个内核文件详解(vmlinuz/initrd.img/System.map)
  8. JavaScript笔记(菜鸟教程)
  9. Excel怎么合并两个或者多个单元格里面的内容
  10. excel打不开_卸载WPS以后为什么无法打开一个新建的Excel工作簿了
  11. python文件起名字的时候不要用模块的名字,不然会默认导入本地的文件,找不到你要的模块方法,会报错AttributeError: module ‘random‘ has no attribute ‘
  12. linux上无法发送163邮件,如何在linux中发送邮件,使用163邮箱发信。
  13. mysql实现两列数据或者两行数据相减
  14. html设置文本颜色三种写法,html字体颜色设置方法
  15. Vue使用快速使用Echarts图标以及使用水滴图
  16. mirna富集分析_miRNA富集分析数据库
  17. 深度学习入门论文(必看)
  18. 写出HTML文档的基础结构,HTML文档的基础结构.ppt
  19. 蓝桥杯单片机比赛学习:6、中断系统之定时器中断的基本原理
  20. VirtualHook: 基于VirtualApp的Java代码hook工具

热门文章

  1. 2020年快手短视频直播电商营销增长宝典
  2. 这样准备,面试成功率提升30%
  3. 写一函数,将一个字符串中的元音字母复制到另一个字符串,然后输出
  4. java liste_内功心法 -- java.util.ArrayListE (1)
  5. python数据科学指南是什么_Python数据科学实践 | Spyder入门
  6. 提高软件开发、软件维护的效率和质量的利器
  7. 专题:数据自治开放(上)
  8. 作者:高丰,英国南安普敦大学计算机博士,现为开放数据与创新独立咨询顾问,兼复旦大学数字与移动治理实验室特邀研究员。...
  9. 【面向对象】类的本质
  10. 【Servlet】Servlet体系结构