目录
1.浅谈一下c和c++的理解?
2.指针和引用的区别?
3.值传递、地址传递、引用传递的区别?
4.引用作为函数返回值的时候,调用的变量需要加上static修饰
5.命名空间:
6.常引用
语言const关键字的作用
关键字的作用
++ const关键字的作用?
10.如何打破const关键字的限制?--->mutable mutable int num;
和 class 的区别
12.构造函数
13.析构函数
delete 和 malloc free 之间的区别?
15.拷贝构造函数
16.深浅拷贝的区别
17.友元函数及作用
18.设计模式--单例模式
++中的异常机制
++面向对象的三大特征
21.运算符重载
22.虚函数
23.重写重载重定义
24.虚继承 虚基类
25.纯虚函数 和 抽象类
26.虚析构
27.模板、泛型编程template
++11新特性
1.浅谈一下c和c++的理解?
c语言是一个面向过程的一种语言、c++是一种面向对象的一种语言
面向过程:就是按部就班一步一步来,想到每一个步骤需要调用什么函数,按照顺序调用函数。
面向对象:就是把问题分解成一个个对象,而对象不是为了解决某一个步骤,而是为了描述事物在解决过程中的行为。
2.指针和引用的区别?
- 引用必须初始化而指针不用初始化
- 引用初始化之后不能改变对象,而指针则可以通过地址来改变对象
- 引用不能赋予空值,而指针则可以赋予空值
- 引用是原来变量的别名,指针则是一种新的变量
3.值传递、地址传递、引用传递的区别?
值传递:实参把值传递给形参、与原来的实参就没有关系、相当于产生了一个新变量、一个新的地址。
地址传递:形参的改变会影响实参,会创建一个指针变量开辟一个新空间,指针保存着实参的地址。
引用传递:形参的改变会影响实参,相当于实参的别名,不需要开辟新的空间
4.引用作为函数返回值的时候,调用的变量需要加上static修饰
Int &num(){
Static int num;//延长生命的周期、返回值是引用为变量本身
num=100;
return num;
}
5.命名空间:
- 避免出现同名冲突、避免命名空间污染
- C++中命名空间只有一个
- 类、对象、c++库函数都在std命名空间定义
6.常引用
- const int& ret 常引用
- 可以直接调用常量
- 常引用作为函数形参的时候、在函数中只能以只读的形式存在、值不能改变
7.C语言const关键字的作用
- const修饰变量的时候定义就被初始化、值不能被改变
- const修饰函数形参变量的时候、该变量在函数中值不能被改变
- const修饰类成员变量的时候,成员函数调用成员变量只能以只读的形式
8.static关键字的作用
c语言:
- static修饰全局变量、只能在本文件被调用
- static修饰函数、只能在本文件被调用
- static修饰局部变量、变为静态变量作用域不变延长生命周期直至整个程序结束为止、多次被调用只能调用一次
C++:
- 类的内部成员用static修饰后变为静态成员变量
- 静态成员必须要进行类外声明->分配空间、未初始化为默认值
- 该类的多个对象可以共享该静态成员变量、静态成员变量不建议使用对象进行调用(语法没有报错、但是没有什么意义)、可以直接通过类名进行调用。
- 静态成员函数->没有this指针只能访问静态成员变量、只能调用静态成员函数
9.C++ const关键字的作用?
- 常函数:一般放在形参列表的后面、常函数的成员变量不能被修改
- 常对象:一般放在类的前后,常对象的成员属性不发生改变
- 常引用:可以赋予常量、定义就被初始化、作为形参的时候,所在函数一般只能以只读的方式进行、值不能被改变
10.如何打破const关键字的限制?--->mutable mutable int num;
- const和#define谁更安全?
- define 是在预处理阶段展开、const是在编译的时候使用
- define没有类型、不做任何类型检查、仅仅是展开;const常量有具体的类型、编译的时候会进行类型检查、const会更安全
- define宏仅仅是展开、有多少次使用就展开多少次不需要考虑内存;const常量会在内存中分配。
11.struct 和 class 的区别
struct默认权限为public 、class默认权限为private
像复杂逻辑的一般用class、像较小体量、结点用的是struct
12.构造函数
函数名与类名相同、没有返回值、可以有参数
创建对象时自动调用的函数
默认构造函数
类中没有显示构造函数、默认调用构造函数
没有参数、没有逻辑、为了存在而存在
13.析构函数
析构函数是对象在被销毁时自动调用的函数、是为了释放对象开辟的空间、防止内存泄漏。没有返回值、没有参数列表、不能重载(每个类只有一个析构函数)
14.new delete 和 malloc free 之间的区别?
- malloc是c语言、c++中的库函数需要头文件#include<>的支持;new是关键字不需要头文件的支持、需要编译器的支持
- 使用new操作符在申请动态内存分配的时候,无需考虑内存块的大小、编译器会根据类型信息自行计算、而malloc则需要显示的支持所需内存的大小
- new操作符再分配内存成功的时候,返回的是对象类型的指针、类型严格与对象类型相匹配、无需进行强制类型转换、而malloc分配内存成功后返回的是void*,需要进行强制类型转换
- new在内存分配失败的时候会抛出bad_alloc异常;malloc在内存分配失败的时候会返回NULL
15.拷贝构造函数
格式:没有返回值 函数名与类名相同 参数 const person&other
Person(const Person&other)
作用:逐个给成员变量赋值
条件:一个存在的对象给另一个对象作为初始化的时候
一个函数的参数是一个类的对象void fun(person p); fun(a);
一个函数的返回值是是一个类的对象
拷贝构造函数的参数是什么传递?
引用传递、如果是值传递会造成死循环、无限拷贝
16.深浅拷贝的区别
前提:当类中有指针成员的时候
浅拷贝:就是将指针中保存的地址复制给新的对象、事实上还指同一块内存、当析构函数对两个对象进行内存释放的时候会出现double free的异常(释放第一个对象内存已经消失、第二个对象保留地址但是内存不存在)
深拷贝:不复制指针的中保存的地址、而是将指针指向的内容复制过来、新对象的指针指向新的地址、二者之间互不干扰
系统默认为:浅拷贝
17.友元函数及作用
当类的外面想要使用类的私有成员、通过友元类来破坏封装性
友元特点:单向的、不能传递、不能继承
18.设计模式--单例模式
保证一个类中只有一个实例对象
有一个类,需要多次的创建与销毁
实现方式:
- 构造函数和拷贝构造函数私有化、保证类的外部他不能有对象和拷贝对象
- 在类的内部创建一个静态私有的一个指针用来承接唯一实例、并在类外进行初始化NULL;
- 在类的内有一个静态共有的函数判断指针是否有地址,为空的话就new一个新的实例并返回,反之就返回实例
19.c++中的异常机制
首先先进行try进行检测如果你发现异常进行抛出throw然后就用catch直接进行抓获。
20.c++面向对象的三大特征
封装:跟据c++的程序设计来说、对于成员变量或者函数的属性可能会不同,一般来说类外可以访问的一般用public修饰、而对于类内成员调用而类外不能调用一般用private来修饰。确保数据安全
继承:子类继承父类的变量和函数、子类可以继承多个父类
多态:多态一般分为静态多态和动态多态、静态多态一般根据函数参数类型不同像重载、动态多态一般在父子继承之间存在,具体体现父类指针指向子类对象
父类有虚函数、子类重写虚函数。
21.运算符重载
对于运算符进行一个重新的定义
A+B 类中this 指向左值 右边 参数对象 int operator(const operator&other)
22.虚函数
用virtual修饰的函数
作用:实现运行时候的多态
父类指针指向子类对象,父类和子类有相同的函数,如果父类是虚函数,子类重写虚函数那么指针调用子类,如果父类不是虚函数那么就是调用父类
23.重写重载重定义
重写:继承 派生类和基类有相同的函数名参数返回值 父类中有虚函数
重载:一个类中 函数名字相同参数不同返回值无所谓
重定义:函数名字相通 参数不同父类就被隐藏,调用子类的函数
函数参数相同 父类函数没有virtual,调用父类的函数
24.虚继承 虚基类
虚基类前提菱形继承:
B继承A、C继承A、D继承B,C A就被多次创建、就会出现二义性,除非你直接用类直接调用
虚继承:使创建父类的操作失效,然后在最底层初始化列表里初始化虚基类
虚基类:virtual public A;
25.纯虚函数 和 抽象类
纯虚函数:父类虚函数声明时候=0
抽象类就是至少有一个纯虚函数 、抽象类不能实例化、但一般可以声明指针、一般用来被继承的、里面纯虚函数专门是被重写的
抽象类的派生类可能是抽象类
类是对对象的具体描述、抽象类根本不具体、从内部来说抽象类里面有的也不能分配内存。
抽象类的派生类只要没有继承纯虚函数就可以实现实例化
26.虚析构
在多态的时候、父类指针指向子类对象、释放父类的时候不会调用子类的虚构函数、所以需要在析构函数前加入virtual、子类和父类都能析构
27.模板、泛型编程template<typename 类名>
模板:可以使用类和函数随时随地传递类型
泛型编程:可以将数据类型作为参数进行传递
28.STL
(1)C++提供的标准程序库、主要是对数据结构和算法的封装
(2)STL主要由容器、算法、迭代器、函数对象、适配器、内存分配器
(3)容器分为序列容器和关联容器
序列容器:元素的位置和值没有关系、不自带排序,我插入制定什么位置就在什么位置 vector list
关联容器:map--红黑数原理 自带默认的排序,元素值和位置有关系
Vector: 基于数组原理内存空间连续 访问元素操作较多首选vector
时间复杂度O(N)O(1) push_back pop_back insert
List:双向链表 内存不一定连续通过指针进行连接 适合插入与删除元素
O(1)O(N)
Map:里面又两个类型 key和value
添加元素O(logN)O(logN):
Insert 里面添加pair对象,key重复添加失败
数组方式:如果健存在修改不存在,添加
查找:find 和数组查找Key 找到key就返回value 没找到就新建一个
29.C++11新特性
auto iter 迭代器遍历的时候、自动识别迭代器遍历类型
智能指针:
auto unqiue share week_ptr