面向对象和面向过程的区别:
面向过程:首先字面意思它是注重过程的,当解决一个问题的时候,面向过程会把事情拆分成: 一个个函数,然后按照一定的顺序,执行完这些方法(每个方法看作一个个过程),等方法执行完了,事情就搞定了。
面向对象: 首先字面意思它是注重对象的。当解决一个问题的时候,面向对象会把事物抽象成对象的概念,就是说这个问题里面有哪些对象,然后给对象赋一些属性和方法,然后让每个对象去执行自己的方法,问题得到解决。
在C++中class和struct的区别:
在C++中class和struct几乎是一样的,也就是struct定义的结构体就是类
默认的访问权限不同:class默认访问权限为private,struct默认访问权限为public;
默认的继承权限不同:class默认继承权限为private,struct默认继承权限为public;
在写类模板类型的代码时,class可以出现在模板参数类表中用来声明类型,但是struct不行
C++面向对象的三大特性:封装、继承、多态
什么是封装?C++中是如何实现封装的特性?
封装的概念:将数据和数据的方法进行有机结合,隐藏对象中的属性和实现细节,仅对外公开接口和对象进行交互------电脑的充电接口,摄像头拍照
如何实现封装:
通过类将对象的属性的方法包装在一起进行有机结合,然后通过访问权限决定哪些成员可以在类外被访问,哪些成员不可以在类外被访问,哪些成员可以在子类中访问但是在类外不能被访问,权限有public protected private
空类的大小是多少?为什么?
主流编译器,空类占一个字节。vs2013和Linux g++下,占一个字节就是区分同一个类所创建的不同对象
空类中有哪些内容?
类中6个默认的成员函数:默认的成员函数就是类中没有显式定义编译器会自动生成
构造函数、拷贝构造函数:深浅拷贝、析构函数、赋值运算符重载、两个&重载:一个是普通类型成员函数, 一个是const类型的成员函数
什么是this指针?
概念:this指针是非静态成员函数隐藏的一个参数,该参数时时刻刻指向当前对象(调用该函数的对象),让编译器区分清楚该次函数调用的是哪个对象进行操作
特性:
1.this没有包含在对象中,不会影响对象sizeof的结果
2.是非静态成员函数的第一个隐藏参数
2.this的类型:普通成员函数:T const、const类型成员函数:const T const
3.传递方式:this call:this指针使用传递方式使用的exc寄存器进行传递
_cdecl:采用参数压栈的方式进行传递
4.该参数由编译器自动进行传递,用户不用去关心,因为该参数由编译器自动添加,因此也由编译器自动传递
解释一下const:
在C语言中:
- 可以使用const修饰变量,表明该变量不可再修改,但仍旧是变量
- const还可以用来修改函数的参数,修饰函数的参数时,表明该函数中不能对形参进行修改,提高代码的安全性
在C++中:
- 修饰变量:在C++中const修饰的变量已经是常量,而且具有宏替换属性,只不过const修饰的常量替换时间在程序编译时,该常量会参与类型检测,提高代码的安全性
- 修饰函数参数:最常见方式是与引用配合,就是说不想通过形参来改变外部的实参
- 修饰类成员:修饰类成员变量:表明该成员变量不能修改,而且必须要在构造函数初始化列表位置进行初始化
- 修饰类成员函数:const修饰类的非静态成员函数,本质是在修改成员函数隐藏的this指针,表明在该成员函数中,不能对非静态的成员变量进行修改,如果要对某个成员变量进行修改时,而成员变量可以使用mutable关键字进行修饰
解释一下static :
在C语言中:
修饰变量:
- 修饰全局变量:修饰全部变量后,这个全局变量具有文件作用域,只在定义它的文件里有效
- 修饰函数体中的局部变量:修饰局部变量后,这个局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,并且只在定义它的函数体中有效
修饰函数:表明该函数只能在当前文件中使用,也就是说被static修饰的函数具有文件作用域
在C++中:
- 修饰变量:与C语言作用相同
- 修饰函数:与C语言作用相同
- 修饰类成员:
static修饰类成员变量----静态成员变量,与普通成员变量区别:
- 在类中进行声明,但是要在类外进行定义
- 静态成员不包含在具体的对象中,是所有对象共享的,因此不影响sizeof的结果
- 访问方式:对象. 或者类名::
- 不能在构造函数初始化列表中进行初始化
static修饰类成员函数----静态成员函数,与普通成员函数的区别:
- 静态成员函数没有this指针
- 静态成员函数不能直接访问非静态成员变量
- 也不能调用非静态成员函数
- 也不能被const修饰,即静态成员函数不能作为const成员函数
- 也不能作为虚函数
- 静态成员函数调用:类型::静态成员函数的名字