Day1

1、 C++与C的区别

各自是什么?特点?不同地方?

<1>字面上: 第一个词是一样,C++是完全兼容C,只要是合法的C的程序在C++中都是合法的!C++是C的增强版本
<2>. C++比C多了两个+,C++中扩展了很多内容,数据类型:引用、类类型、布尔类型等!关键字:friend、class、bool、public等!
<3>.编程思想是不一样的,C语言是面向过程的结构化的程序设计语言,中级语言。

C++是面向对象的编程语言,更接近自然界的发展规律!
什么是面向过程:
 注重的是过程,只有过程对了,才有可能得到正确的结果;
 C语言中其实也有面向对象,只不过不够彻底;
什么是面向对象:
 注重的是结果
 学生{静态的属性和行为整合在一起};

例子:红烧鱼: 自己做—按步骤一步一步的去实现
点外卖:不关注店家是怎么做的,我只要结果

C++应用场景:
1.	QT:嵌入式产品的图形界面UI设计- C++实现的
2.	人工智能:图像处理—opencv框架  C++去实现
3.	游戏方向

2、 命名空间

在C语言中,同一个作用域中能不能出现同名的变量?出现同名的函数?自定义同名的数据类型? 答案是不可以的!

在实际生活中,一定会出现同名的!例如:一个班级中有同名的学生!一个校区的不同班级中也可以有同名的学生!

是什么? 作用范围

解决问题:解决命名冲突的问题!变量、函数、自定义的数据类型

什么时候用?
  一个老师带A班,B班;A班有张三,B班也有张三;
  老师叫张三的时候,有可能来的是A班的,也有可能来的是B班,如何区分?
  叫人的时候加上归属(作用域): A的张三
怎么用:
 命名空间格式:
         namespace 命名空间的名字{可以有变量,也可以有函数,还可以有自定义的数据类型};
 使用:
            命名空间名字::变量等!
            使用using namespace 命名空间名字; 切换到对应的范围中,直接使用即可!

在这里插入图片描述

3、 标准输入输出流

C语言中标准的输入输出头文件 stdio.h
库函数 Scanf、 printf在C++中是可以直接使用的!
除此之外,C++中也有提供专门用来做输入输出流!

什么是流: 以字节为单位,连续不断,方向一致的称为流!

输入流对象: cin
使用: cin>> 变量;
输出流对象: cout
使用:<< 变量;
好处: 输入输出不需要做格式的限制,使用简单

4、 引用类型-----引用与指针的区别(面试常问的题目)

什么是指针: 保存地址,得到地址,可以对地址中的内容做修改、访问!
应用在: 函数参数设计

引用: 可以实现和指针一样的效果。
目的:

  1. 弱化指针,能用指针实现的可以替换成引用!
  2. 减少临时空间的分配: int *p;就需要给p分配内存空间;引用是不需要分配内存空间。
    什么是引用: 就是给变量起别名,变量是已经存在的,别名和变量指的是同一块内存空间!

定义的格式: 数据类型 &引用名 = 变量名;
Int p = 10;
Int &pt = p; // 这里的pt就是给p起的别名

整理一下:引用与指针的区别:
  1. 引用是给变量起别名;指针是用来保存地址;
  2. 定义指针变量系统会给分配内存空间,定义引用不会额外的分配内存空间;
  3. 指针变量定义完之后可以不进行初始化,但是一般为了避免野指针,会初始化为NULL;
    引用定义完必须进行初始化
  4. 指针变量是可以改变指向,但是引用一旦初始化之后不可以改变指向。使用引用比使用指针安全!
  5. 应用:都可以设计成函数的参数类型。

5、 函数重载

函数名的设计比较困难

两数求和或者交换封装函数:
Int sum(int a, int b); //只能实现两个int类型数的求和
Double sum_double(double a, double b);
char sum_char(char a, char b);

解决问题:函数功能相似,参数不同(参数类型不同)的一组函数,解决函数名命名困难的问题!(在C语言中不能出现同名函数)
函数重载定义: 函数名相同,函数功能要相似,参数不同(参数类型不同、参数个数不同、参数类型的顺序不同),与返回值类型无关的一组函数!
函数调用的原理:
函数定义完之后在内存中是有一块空间,编译成2进制文件,调用函数的地方存的就是函数在内存中的地址;根据地址找到对应的代码块去执行(函数名指的就是函数的地址),执行完之后再反回到调用的地方继续往下执行!

总结:

函数重载的原理: 使用g++进行编译的时候,函数名会根据参数类型以及参数个数进行重命名,函数名字不一样,函数在内存中的地址就不同,调用的时候执行的就是不同的函数体!

6、 参数默认值

什么是参数默认值:就是在函数定义的时候给了形参一个初始值。

当我们在调用函数的时候,可以选择性的给这个参数值,可以给它值也可以不给它值!如果不给它值,按默认值参与函数体中的运算;如果给了它值,就按给的值参与函数体中的运算!
当函数参数有默认值,可以解决函数重载中 只有参数个数不同的而造成的代码冗余!

在设计函数参数默认值的时候要注意:

1.参数默认值给的顺序是 从右向左的;调用函数的时候参数匹配的顺序是从左向右的!
2.在函数重载中,当函数参数有默认值的时候要注意二义性,不然就会出错!
3.当函数声明和函数定义同时存在的时候,参数的默认值只能出现一次,建议放在函数声明的地方!

7、 如何在C++中引入C的库

C中的标准库在C++中使用:直接 #include<>即可!
如何解决:
目标:C的库既能在C中使用,也能在C++中使用!
先要明确当下使用的编译器是g++还是gcc?
如何判读编译器是g++还是gcc?
方法1:
在这里插入图片描述
方法2:计算一个字符占的内存大小,也可以来区分!!!
最终的解决方案:
Extern “C”{} 告诉C++编译器按照C的规则去处理即可
在这里插入图片描述

8、 动态内存分配

C中的动态内存分配:
malloc库函数
free库函数

C++中有提供另外的动态内存分配的方法:
New运算符 –开空间
Delete运算符—释放空间

书写格式:
数据类型 *指针变量 = new 数据类型; ==》 delete 指针变量;
数据类型 *指针变量 = new 数据类型[个数]; ==》 delete [] 指针变量;

整理面试题目: new和malloc的区别?
1.	New是C++中的运算符,malloc是C中标准的库函数;
2.	书写: new后面只要跟数据类型即可,并且开空间后不需要进行强制类型转换;
Malloc开空间:要给开空间的大小,并且开空间后要进行强制类型转换;
3.	New开的空间用delete去释放; malloc开的空间free去做释放;
4.	New开的空间可以让做初始化,malloc开的空间初始化要自己用memset去做;
5.	对于类类型来说,new的方式去创建对象,会自动的调用构造函数;delete释放对象的时候会自动调用析构函数;
Malloc是不会执行构造函数的,free是不会执行析构函数的!!!

Day2

1、 面向对象编程中的类和对象

面向过程编程:一步一步的去实现;

面向对象编程:点外卖,坐等着吃
在整个程序都是由一个一个的对象组成
对象是由数据结构+算法组成的,这个其实就是通过面向过程实现的!

C里面面向对象:是由结构体来实现的!
链表==》就是一个一个的结构体组成; 除了设计了结构体,还有封装了一些函数(对链表进行增删改查的操作)。
什么是结构体: 为了描述一类事物的属性而自定义的一种数据类型!
学生:
属性: 学号、姓名、性别、出生日期、成绩。我们结构体只能描述属性,并不能把学生描述的活灵活现的,缺少行为。
行为:上课、吃饭、睡觉、做作业
访问: 变量名.属性名!

1-1、 C++中的结构体与C中结构体的区别?

<1>.c结构体中不能有函数;而C++结构体中是可以有函数的!
<2>.c中空结构体的大小为0字节;C++中空结构体的大小为1字节
什么是类:为了描述一类事物的属性和行为而自定义的一种数据类型!
把属性和行为整合在一起 {}
类的关键字: class
格式: 上
Class 类名{属性;行为};
C++中的结构体: struct 名字{属性;行为};

C++中有提供一个专门用来表示字符串的数据类型— string 类

1-2、 C++中的类与C++中结构体的区别?

<1>.关键字不同: 类是用class 结构体用struct
<2>.初始化的方式是不一样的:
结构体的初始化是 数据类型 变量名 = {};
但是类变量的初始化是不能按结构体的方式去做;
<3>.成员默认的权限是不同的:
结构体中成员的默认权限是 公共的 public
类中成员的默认权限是私有的 private
<4>结构体定义出来的变量就是变量;
类数据类型定义出来的变量叫 对象
补充:
C++中类成员的访问限定符有3种
public: 公共的,公有的 类的外部是可以直接访问的
private: 私有的 类的外部是不可以访问的,类的内部是可以访问的!
protected: 受保护的

什么是类的外部:{}外
什么是类的内部:{}内
什么是对象: 就是用类这个数据类型定义的变量;
类和对象的关系:
类这个数据类型是抽象; 对象是具体的。
类是对象的抽象;对象是类的具体实例!
例子:手机 我的手机
定义数据类型的时候,系统是不会给分配内存空间的,但是它是有大小的;只有在定义变量的时候才会按照这个数据类型的大小给变量分配内存空间!!!

面向对象编程有4大特性

抽象、封装、继承、多态

2、 封装—面向对象编程中4大特性

面试题目: 谈谈你对封装的理解(谈谈你对面向对象编程的理解)
封装:把一类事物的属性和行为整合在一起,封装!
抽象:把一类事物的共同的属性和行为提取出来。

总结封装:
把一类事物的属性和行为提取出来,用自定义的数据类型 类 包在一起,该隐藏的隐藏起来,该暴露的暴露出来!
哪些是需要隐藏起来的:属性
哪些是需要暴露出来的:行为—接口

3、 继承

为什么要使用继承,解决什么问题?
减少代码冗余,新写的代码中可以直接使用已经有了的代码,提高开发效率!

qq版本更新:
其实就是在原有的代码的基础上新增一些功能代码或者是完善一个功能!
面向对象编程:
原有类的基础上创建新的类出来,新的类中可以直接使用原来类中的内容,新的类中可以增加新的数据成员和成员函数!
继承的好处:
减少代码冗余、提高开发效率、减少出错!

什么使用继承:
一个类是另外一个类的特殊版本的时候,就可以使用继承!
父类与子类
父类:已经存在的类
子类:新创建的类
继承是如何继承的呢?
子类继承父类的所有(数据成员和成员函数) 友元是否会被继承?不会被继承,因为他不是类的成员,不具有传递性!构造函数和析构函数是不会被继承!
继承的格式是什么样子的?
Class 子类名:继承方式 父类名{};
继承方式有三种:
Public继承:
Private继承:
Protected继承:
总结:

  1. 只有public方式继承,父类的成员访问权限和原来是一样的!
  2. 用private、protected方式继承,父类的public成员在子类外都不可访问!
  3. 一般都使用public方式继承!
  4. 父类的protected成员在子类内可以访问!

3、 多态的概念

多态:多种状态、多种形态
水: 水在不同环境下会呈现出不同的状态

C++中: 调用同一个函数名,传入不同的参数,就会执行不同的函数体!
函数重载—其实就是一种多态

3.1、 静态(绑定)多态和动态(绑定)多态!!!

什么是静态(静态库):
在编译阶段会链接到可执行文件中
什么是动态(动态库):
在运行阶段会链接到可执行文件中

总结:
静态和动态的区别: 链接的时刻不同

什么是静态多态:调用一个函数,在编译阶段就知道要执行的函数是哪一个
体现在:函数重载、运算符重载
G++去编译的时候,会根据函数的参数类型以及参数个数对函数进行重命名,调用的时候不同的函数名对应不同的函数体!
什么是动态多态:调用一个函数,在运行阶段才知道要执行的函数是哪一个
体现在:继承、虚函数
绑定:调用函数的语句与函数体进行绑定

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐