c/c++基础知识点,面试总结:
1、类和结构体的区别?
C语言结构体当中只能定义变量,而c++类不仅可以定义变量还可以定义函数。
但是在c++里面类可以定义函数。
2、static关键字的特点/作用?
①隐藏作用,一个文件中的某个全局变量用static修饰的话,这个全局变量对其他文件是不可见的。有的程序是由好多.c文件构成。彼此可以互相引用变量,但加入static修饰之后,只能被本文件中函数引用此变量。
②保持变量的值不变,某个函数的局部变量用static修饰的话,这个局部变量的值并不会随着该函数调用的结束而消失,下次调用该函数时该变量的值依然保存着上次调用后的值。
③如果函数用static来修饰,作用和修饰全局变量类似

static关键字在c++中特有的作用:类中的成员变量用static来修饰的话,这个成员变量就属于该类,不管这个类实例化多少个对象,这个变量只会在内存中保留一份,为所有对象共有。
如果用static修饰成员函数,那么所有这个类的所有对象共用这一个静态成员函数,且该静态成员函数内部不能访问非静态数据成员。
为什么静态成员函数内部不能访问非静态数据成员?如果是非静态数据成员,那么每一个对象都会有该数据成员,又静态成员函数可以通过类名直接访问,因此在对非静态数据成员进行赋值或者其他操作时,无法判断是对哪一个对象的非静态数据成员进行操作,因此静态成员函数内部是不能访问非静态数据成员的。

类的静态数据成员在类的内部定义,但是要在类的外部进行初始化。

3、C语言如何防止头文件被重复引用
使用#pragma once

4、什么是多态?如何实现多态?
多态是c++面向对象程序设计的一大特性,多态分为编译时的多态和运行时的多态,前者是指函数重载:两个函数函数名相同,但是有不同的参数个数和参数类型,调用时根据不同的参数个数和类型进行调用,这就是一种多态。后者指的是其实是虚函数重写(函数重写),同时要求还要有派生类,并且基类的指针要指向派生类的对象,这样才能实现多态。

5、面向对象程序设计的优点有哪些?
开发时间短,而且可以采用大量的模板库比如stl,软件的维护也比较方便。

6、函数指针和回调函数
什么是函数指针?函数指针就是指向函数的指针变量
回调函数指的是通过函数指针调用的函数(本来是个普通函数),当时调用它的时候不是通过函数名而是通过指向这个普通函数的指针来调用它,此时这个普通函数叫做回调函数。

int A(int x,int y)
{int z=x+y;return z;
}
//定义一个函数指针,函数返回类型+(*指针名)+函数参数列表
int (*p)(int a,int b);//定义了一个函数指针p,它指向的函数是谁目前不知道,但是可以知道它指向的函数返回值为int类型,而且带了两个形参。
p=A;//把函数A的地址赋值给函数指针

7、虚析构函数的作用?
防止内存泄漏:当基类的指针指向派生类的对象的时候,我们想释放掉这个对象占用的动态内存,如果基类不用虚析构函数,那么想释放派生类的对象时只会调用基类的析构函数,派生类对象占的空间无法释放,导致内存泄露。

8、this指针指向谁?
指向当前正在使用对象。

9、哪三种传参的方式?
值传递,引用传递,指针传递。适用于哪些情况?
值传递就是让函数内部普通的接受外部的值;
引用传递和指针传递就是想通过调用的函数来修改实参的值。
什么情况下使用引用,而不是使用值传递?
①想要修改实参的值的时候;②传递的参数数据占的空间很大,如果采用值传递,形式参数会占用一部分空间,而使用引用传递则不会重新开辟内存空间。
使用常引用既能达到和传指针一样的效率,又可以保证数据在函数中不被改变。

10、什么是引用?
引用就是对变量起别名,对引用的操作和对变量直接操作完全相同,声明引用时一定要初始化,而且初始化后就不能再改变了。

11、野指针和空指针的区别?
空指针初始化时指向null,内存编号为0的地址,内存中编号0-255是由系统占用空间。
野指针?先想想什么是指针?当我们声明一个指针变量的时候,肯定会在内存中给指针变量分配一个内存空间(指针也是一个变量,存放的内容是地址),至于指针变量在内存中占多少个字节,这要看不同的平台,通常是4个字节或者8个字节。那么如果我们定义一个指针没有初始化的话,系统给它分配个内存空间,这块空间里面存放的是什么值,我们是不知道的,恰巧这块空间里的值就决定了这个指针的指向,因此如果空间里的值是一个随机的值,那么指针指向的地方也是随机的,可能指向一个有访问权限的,也可能指向一个没有访问权限的,这就是产生野指针的一种情况。

12、各种不同性质的变量到底存放在内存的哪个区域???
全局存储区域(静态存储区域):静态变量,全局变量
代码区:代码。。。。
栈区:局部变量,const修饰的局部变量也是在这里,函数的形式参数
堆区:程序运行时动态分配的对象,例如用new和malloc开辟的空间就是在堆上面。
常量区:字符串常量,const修饰的全局变量(这也是为什么全局存储区域和常量区的地址靠的很近的因素)

void f(){int *p=new int(10);
//在这个函数里我们定义了指针变量p,它指向的内存区域存放着整型10,这个指针变量存放在哪:栈里;
//10这个整型存放在哪?:堆里
}

13、指针怎么理解呢?int* p,也可以理解为p的类型是int*,是一个指针类型(char*,float*等等)赋给p的值都被认为是地址,所以函数返回值类型也可以是地址。

int* fun()
{int *p=new int(10);return p;
}

那么同样的道理,引用也可以这么来理解,例如 :

int& fun(){int a=10;return a;//“引用”类型(int&,double&,char&等等)因此函数的返回值类型是int&
}

14、关于c++中引用(c是没有引用的,而引用是c++才有的神级别操作):
①引用可以作为函数的返回值,但是千万不能返回局部变量的引用,因为局部变量放在栈里面,这是个动态区域,一旦函数调用完成,这块区域就会被释放,这个局部变量对应的引用就会出现错误。
②当想要让函数作为左值时,那么一定要返回引用

int& fun()
{static int a=10;//a是静态局部变量,放在全局区域中,并不会随着函数的结束而消失。return a;
}fun()=1000//此时fun()其实就是a的引用,fun()相当于作为左值进行赋值,此时a的值已经由10变成1000了

③引用的本质是什么?c里面有了指针,为什么c++还要添加引用呢?
引用的本质是一个常量指针,为什么要使用引用?相对于指针来说,引用更加方便,明白而且引用不需要开辟额外的空间,在进行两个变量的值的交换时,函数的形式参数可以时实参的引用,这样也能达到交换变量的值的效果。

15、函数重载的注意事项。
我们知道函数重载其实是编译时的多态,函数重载的条件是:函数名相同,但是函数的参数列表中参数个数或者参数类型或者参数的顺序不同,即可构成函数的重载。但是这一块有个小坑
那就是:当存在默认参数时会导致函数重载失败,如下:

void fun(int a,int b=10)
{cout<<"111";}
void fun(int a)
{cout<<"222";
}
//编译器预处理时因为两个函数虽然同名,但是参数个数不同,所以不会报错
int main()
{fun(10,20);//调用成功,调用第一个函数因为有两个参数fun(10);//此时调用会失败,因为两个函数都满足条件,为什么传一个参数也可以调用第一个是因为它存在默认参数}

16、const的作用?
①const修饰的内容不可进行修改
②c++中const修饰成员函数时意味着该成员函数不能修改类的成员变量。
成员函数后加const
const如何修饰成员函数?const关键字加在最后面,例如:

void fun(int a) const
{}

声明对象前加const,则该对象为常对象,常对象不能对内部的数据成员进行修改,因此常对象只能调用常函数。

17、inline放在函数定义前,把该函数定义为内联函数,内联函数的作用是减少cpu的开销。
内联函数通常会在它的调用点上内联的展开,(就是相当于把函数代码插入到调用点,会导致代码膨胀),但是我们将函数设为内联函数,编译器不一定会展开它,这只是我们的请求而已。内联函数可能会导致代码执行速度变快,也有可能会导致代码执行速度变慢。

18、空类即一个类里面没有任何数据成员和成员函数如果使用sizeof也会显示占用一个字节的空间,为什么?
深度探索c++对象模型中是这样说的:
那是被编译器插进去的一个char ,使得这个class的不同实体(object)在内存中配置独一无二的地址,也就是说这个char是用来标识类的不同对象的。
类的成员函数是不占用类对象的内存空间,同时类中的静态数据成员也不占用类对象的内存空间,为什么呢,类中的静态数据成员是属于这个类的,在内存空间中只有一份拷贝,不单属于某个对象,因此不占用类对象的内存空间。

19、构造函数可以进行重载,而析构函数不能进行重载,为什么?构造函数有参数,而析构函数没有参数,因此不能重载。构造函数通常都是public,但是其实也可以设置成private,这样会导致该类无法在外部被实例化。

20、什么情况会用到拷贝构造函数?
①当用一个已经创建好的对象去实例化一个新的对象,此时会调用拷贝构造函数。
②当把对象作为函数的参数进行值传递的时候。
③当函数的返回值是对象的时候,此时我们在主函数中用一个对象去接受该函数的返回值,就会调用拷贝构造函数。

为什么要用深拷贝?当类中含有动态数据成员时,例如当类中含有一个int 类型的指针时,我们在构造函数中给这个指针初始化,动态开辟一块内存空间让这个指针指向它,然后利用构造函数传参把值放到该内存空间中。

person(int age)
{q=new int(age);//q是person类的一个int型指针,开辟一个内存区域,存放age
}

那么拷贝构造函数怎么写??
①如果不使用深拷贝,直接用系统的默认拷贝构造函数(浅拷贝),就会出现对象p1的指针q指向内存0x0111,用p1初始化对象p2时,p2的指针q也会指向内存0x0011.那么其中一个对象使用完成后,释放这片内存区域后,另外一个对象也会对这个内存区域再次进行释放,就会导致出错。
②如果使用深拷贝,自己写一个拷贝构造函数,在拷贝构造函数中,使用new重新开辟一片新的内存空间,里面存放age,并且让p2的指针q指向该区域,就不会出现重复释放的情况了。

21、当子类和父类有同名的成员函数时,子类会隐藏父类中所有的同名成员函数(即使存在重载函数只要函数名相同就会被隐藏起来),如果子类实例化对象后,该对象调用该成员函数时会直接调用子类的该同名函数,要是想调用父类的同名成员函数,需要加上父类的作用域。

22、虚基类和虚继承的概念??

其中A就是虚基类,上图中在B和C继承A时,如果不采用虚继承的方式,那么当D采用多继承分别继承B和C时,就会导致A中的同一份数据在D中继承两份,这样导致二义性或者资源浪费。但是采用虚继承就会解决这样的问题,而且A就是虚基类。
虚继承的目的是让某个类做出声明,承诺愿意共享它的基类。其中,这个被共享的基类就称为虚基类(Virtual Base Class),上图中 A 就是一个虚基类。在这种机制下,不论虚基类在继承体系中出现了多少次,在派生类中都只包含一份虚基类的成员。

23、虚函数实现多态时的一些小细节:当父类的指针指向子类的对象时,这个指针只能调用子类从父类继承过来的成员变量和成员函数,子类新增的成员变量和成员函数是无法通过这个父类指针直接进行访问的,但是如果子类中重写了父类的某个成员函数,且父类中将该成员函数定义为虚函数,那么可以通过该指针访问子类中重写后的成员函数。

#include<iostream>
#include<string>
using namespace std;
class base
{public:int m_x;base(int x){m_x = x;}void fun(){cout << "父类fun";}virtual void display(){cout << "这是父类" << endl;}
};class son:public base
{public:int m_y;son(int x, int y): base(x){m_y= y;}void fun(){cout << "子类fun";}void display(){cout<<"这是子类"<<m_y<<endl;}
};void test1()
{son s1(10,20);base *p=&s1;//cout << p->m_y;//无法直接访问m_y;p->display();//基类指针通过调用虚函数里访问子类新增成员m_yp->fun();}
int main()
{test1();return 0;
}

遇到的面试题基础知识相关推荐

  1. Java面试题基础知识(收集)

    1.集合类:list和Set比较,各自的子类比较(Arraylist,Vector,inkedLIst,HashSet,TreeSet) List:存入元素有序,元素可以重复,允许null值得存在,主 ...

  2. C/C++ 面试题基础知识

    C/C++ 中struct的区别 C中的struct是没有权限设置的.  C++中struct增加了访问权限,且可以和类一样有成员函数.  C++中的struct等同于class,只是class默认成 ...

  3. 组装一台多媒体计算机必须的部件,计算机基础知识试题8周周周练.doc

    计算机基础知识试题8周周周练.doc (8页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 城关中学对口升学班"计算机文化基础& ...

  4. 超详细的Java面试题总结(四 )之JavaWeb基础知识总结

    系列文章请查看: 超详细的Java面试题总结(一)之Java基础知识篇 超详细的Java面试题总结(二)之Java基础知识篇 超详细的Java面试题总结(三)之Java集合篇常见问题 超详细的Java ...

  5. 科学计算机程序 字表处理软件都是,计算机应用基础知识_计算机应用基础试题及答案【最新资料】.doc...

    计算机应用基础知识_计算机应用基础试题及答案[最新资料] 计算机应用基础知识 计算机应用基础试题及答案 ? 计算机应用基础知识1.1填空题1.第一代计算机采用的电子器件是--[答案] 电子管2.第四代 ...

  6. 计算机二级公共基础知识2017,2017年计算机二级公共基础知识基础试题

    2017年计算机二级公共基础知识基础试题 随着微处理机的迅速发展,计算机广泛应用于工业.农业.文化教育.卫生保健.服务行业.社会公用事业等.yjbys小编收集了一些关于计算机二级公共基础知识基础试题, ...

  7. 计算机基础资料管理办法,计算机基础知识试题(答案_)资料.doc

    计算机基础知识理论试题(一) (一)单选题(选择最佳答案) 1.在Windows98中,单击_____D___按钮,可以使窗口缩小成图标,位于任务栏内. A.还原 B.关闭 C.最大化 D.最小化 2 ...

  8. 计算机应用基础试题事业单位,机关事业单位技术工人计算机应用基础知识复习题...

    机关事业单位技术工人计算机应用基础知识复习题 工人技师 计算机考试试题库 公共部分 5.在 Windows 中,文件名的最大长度为___256 个西文或者 128 个汉字________. 6.制作网 ...

  9. 计算机基础知识考试模拟试题,计算机基础知识模拟试题及答案

    计算机基础知识模拟试题及答案 1.下列四个无符号十进制整数中,能用八个二进制位表示的是__________. A.257 B.201 C.313 D.296 2.下列关于系统软件的四条叙述中,正确的一 ...

最新文章

  1. VC中基于 Windows 的精确定时
  2. Java 判断一个字符串是否为数字类型
  3. 队列学习笔记 顺序队列
  4. 配置FTP服务(一):pureftp部署和优化
  5. 如何在Rancher 2.2 Preview2上部署和管理多K8s集群应用 1
  6. string拆分为int_拆分为流
  7. python可视化水平双向箭头_python数据可视化第二弹
  8. Win7电脑,无法把文件保存到桌面上?
  9. Vue-cli项目中路由的基础用法,以及路由嵌套
  10. HTML Table 固定列宽,实现excel表格效果
  11. Halcon模板匹配(基于相关性)
  12. win7QQ安装包可能被非法改动导致安装失败怎么办
  13. 为什么搜狗输入法显示服务器异常,为什么搜狗拼音输入法一直出现错误报告?...
  14. Java开发需要学什么!中原银行java面试题目
  15. 自学Java day24 一篇文章弄懂mySQL基础命令 从jvav到架构师
  16. 对比农行与建行网银业务办理流程
  17. 采用SpringBoot发送简单、抄送、密送、带附件邮件
  18. 详解Git合并冲突——原因及解决 “Automatic merge failed; fix conflicts and then commit the result.“
  19. sdk是什么意思_学好前端的6点建议,企业需要什么样的Web前端人才?
  20. Linux 修改群组文件夹权限

热门文章

  1. [DAX] FORMAT函数
  2. 计算机文化基础—IT概论
  3. 深圳一普通中学老师工资单曝光,秒杀程序员,网友:酸了酸了
  4. Windows设置默认打印机
  5. 片上总线Wishbone 学习(九)总线周期之单次读操作
  6. 学生计算机教室怎么连接网络,计算机(网络)教室学生使用守则
  7. 获取android应用缓存目录时遇到的问题
  8. uniapp处理tsconfig.json报错
  9. 计算机网络-数据交换技术
  10. WPS服务器维护,wps卸载云服务器