c++基础知识总结

时间:2025-03-25 21:42:36

目录

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.指针和引用的区别?

  1. 引用必须初始化而指针不用初始化
  2. 引用初始化之后不能改变对象,而指针则可以通过地址来改变对象
  3. 引用不能赋予空值,而指针则可以赋予空值
  4. 引用是原来变量的别名,指针则是一种新的变量

3.值传递、地址传递、引用传递的区别?

值传递:实参把值传递给形参、与原来的实参就没有关系、相当于产生了一个新变量、一个新的地址。

地址传递:形参的改变会影响实参,会创建一个指针变量开辟一个新空间,指针保存着实参的地址。

引用传递:形参的改变会影响实参,相当于实参的别名,不需要开辟新的空间

4.引用作为函数返回值的时候,调用的变量需要加上static修饰

Int &num(){

Static int num;//延长生命的周期、返回值是引用为变量本身

num=100;

return num;

}

5.命名空间

  1. 避免出现同名冲突、避免命名空间污染
  2. C++中命名空间只有一个
  3. 类、对象、c++库函数都在std命名空间定义

6.常引用

  1. const int& ret 常引用
  2. 可以直接调用常量
  3. 常引用作为函数形参的时候、在函数中只能以只读的形式存在、值不能改变

7.C语言const关键字的作用

  1. const修饰变量的时候定义就被初始化、值不能被改变
  2. const修饰函数形参变量的时候、该变量在函数中值不能被改变
  3. const修饰类成员变量的时候,成员函数调用成员变量只能以只读的形式

8.static关键字的作用

c语言:

  1. static修饰全局变量、只能在本文件被调用
  2. static修饰函数、只能在本文件被调用
  3. static修饰局部变量、变为静态变量作用域不变延长生命周期直至整个程序结束为止、多次被调用只能调用一次

C++:

  1. 类的内部成员用static修饰后变为静态成员变量
  2. 静态成员必须要进行类外声明->分配空间、未初始化为默认值
  3. 该类的多个对象可以共享该静态成员变量、静态成员变量不建议使用对象进行调用(语法没有报错、但是没有什么意义)、可以直接通过类名进行调用。
  4. 静态成员函数->没有this指针只能访问静态成员变量、只能调用静态成员函数

9.C++  const关键字的作用?

  1. 常函数:一般放在形参列表的后面、常函数的成员变量不能被修改
  2. 常对象:一般放在类的前后,常对象的成员属性不发生改变
  3. 常引用:可以赋予常量、定义就被初始化、作为形参的时候,所在函数一般只能以只读的方式进行、值不能被改变

10.如何打破const关键字的限制?--->mutable   mutable int num;

  1. const和#define谁更安全?
  1. define 是在预处理阶段展开、const是在编译的时候使用
  2. define没有类型、不做任何类型检查、仅仅是展开;const常量有具体的类型、编译的时候会进行类型检查、const会更安全
  3. define宏仅仅是展开、有多少次使用就展开多少次不需要考虑内存;const常量会在内存中分配。

11.struct 和 class 的区别

struct默认权限为public 、class默认权限为private

像复杂逻辑的一般用class、像较小体量、结点用的是struct

12.构造函数

函数名与类名相同、没有返回值、可以有参数

创建对象时自动调用的函数

默认构造函数

类中没有显示构造函数、默认调用构造函数

没有参数、没有逻辑、为了存在而存在

13.析构函数

析构函数是对象在被销毁时自动调用的函数、是为了释放对象开辟的空间、防止内存泄漏。没有返回值、没有参数列表、不能重载(每个类只有一个析构函数)

14.new delete 和 malloc free 之间的区别?

  1. malloc是c语言、c++中的库函数需要头文件#include<>的支持;new是关键字不需要头文件的支持、需要编译器的支持
  2. 使用new操作符在申请动态内存分配的时候,无需考虑内存块的大小、编译器会根据类型信息自行计算、而malloc则需要显示的支持所需内存的大小
  3. new操作符再分配内存成功的时候,返回的是对象类型的指针、类型严格与对象类型相匹配、无需进行强制类型转换、而malloc分配内存成功后返回的是void*,需要进行强制类型转换
  4. new在内存分配失败的时候会抛出bad_alloc异常;malloc在内存分配失败的时候会返回NULL

15.拷贝构造函数

格式:没有返回值 函数名与类名相同 参数 const person&other

Person(const Person&other)

作用:逐个给成员变量赋值

条件:一个存在的对象给另一个对象作为初始化的时候

      一个函数的参数是一个类的对象void fun(person p); fun(a);

      一个函数的返回值是是一个类的对象

拷贝构造函数的参数是什么传递?

引用传递、如果是值传递会造成死循环、无限拷贝

16.深浅拷贝的区别

前提:当类中有指针成员的时候

浅拷贝:就是将指针中保存的地址复制给新的对象、事实上还指同一块内存、当析构函数对两个对象进行内存释放的时候会出现double free的异常(释放第一个对象内存已经消失、第二个对象保留地址但是内存不存在)

深拷贝:不复制指针的中保存的地址、而是将指针指向的内容复制过来、新对象的指针指向新的地址、二者之间互不干扰

系统默认为:浅拷贝

17.友元函数及作用

当类的外面想要使用类的私有成员、通过友元类来破坏封装性

友元特点:单向的、不能传递、不能继承

18.设计模式--单例模式

保证一个类中只有一个实例对象

有一个类,需要多次的创建与销毁

实现方式:

  1. 构造函数和拷贝构造函数私有化、保证类的外部他不能有对象和拷贝对象
  2. 在类的内部创建一个静态私有的一个指针用来承接唯一实例、并在类外进行初始化NULL;
  3. 在类的内有一个静态共有的函数判断指针是否有地址,为空的话就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