1.C/C++中传参方式有哪些?有什么区别?
首先有三种传参方式,分别是:值传递——>指针传递——>引用传递
1)值传递
a. 形参会将实参复制到一块新的地址空间中,就相当于房间1和房间2,里面变量值相等。在函数内部操作形参,就是在房间2里面操作变量,你如何操作房间2中的变量,房间1里的始终不会发生任何改变。
b. 自然而然可以看到房间2和房间1地址不一样,将原本房间1的变量值复制到房间2中涉及到拷贝
2)指针传递
a. 指针传递不再是复制实参的值了,而是复制实参的地址号作为形参,将实参的地址作为一个变量保存到一个新的空间。
b.需不需要拷贝呢?需要;需不需要另外开辟空间呢?需要来存放实参的地址;那么对形参操作会对实参有影响吗?当然了,地址一样,操作的不还是房间1里的值嘛
3)引用传递
a. 引用传递就相当于形参和实参链接成为一体了,不经历值拷贝和地址拷贝,不用开辟新的地址空间。
b.链接上成为一体了,自然而然操作形参就是操作实参。
2.全局变量在头文件定义会出现什么问题?
1. 首先说,全局变量可以在头文件中声明,但不应该定义,也就是说不应该初始化值。
2,当以个全局变量在头文件中定义后,多个源文件引用该头文件并使用此全局变量,出现一个全局变量被定义多次问题,链接时产生重复定义的错误
3.应该怎样做?头文件.h文件使用extern 只进行声明,源文件中进行定义。
3.面向对象编程的特性或者说C++的三大特性
1.封装
首先说封装、或者说面向对象编程主要优势是为了复用和解耦。
封装是什么?将一些对象的共有特征(属性、成员属性)和共有行为或者是抽象行为(方法,也叫成员函数)装在一个类中。其中这些属性和方法可以共有(就是共享的),也可以私有(就是我独享的)。
2.继承
封装成了一个类比如叫做人,那么创建一个他的子类叫做男人。难道男人类和人类之间共有的属性和方法我还要在男人类里再定义一遍吗?当然不用,我们可以让男人类继承人类,这样人类中所有共享的属性和方法我们男人类也就轻而易举得到了。
3.多态
a.重写:前面说了,封装除了会将共有的属性和方法封装进去外,一些抽象的方法(还没确定它的具体行为)也封装进去了。那么我们男人类也继承了这个抽象方法,但是现在我在男人类中,我想要实现他的具体方法,那么这时候就要对人类中的这个抽象方法进行重写。其实就是子类重新实现父类中的虚函数。在C++中,使用virtul修饰的函数叫做虚函数,其实这个虚函数和pyhon中的抽象方法一个意思。
b.重载:重载也算是多态,他的要求是:在同一作用域下,比例一个类中,一个函数和另一个函数函数名相同,参数列表一定不同,返回值类型不做要求,那么这个函数就是另一个函数的重载。
c.其实,重写也是有条件的,必须是子类对父类的重写,不能颠倒。被重写的这个父类中的函数必须是虚函数,且必须时公有继承。子类中重写的函数必须和父类中的虚函数函数名、参数列表和返回值类型必须一样。
4.C++中的多态是什么?怎么实现的?
C++多态:一句话来讲就是同一操作但是作用于不同对象会产生不同的效果。
C++多态分为两种:静态多态(编译期多态)和动态多态(运行时多态)
1.静态多态(编译器多态):程序编译期间就确定调用哪个函数,核心依赖静态绑定
主要实现方式:重载、运算符重载、模板
前提:同一个作用域
2.动态多态(运行时多态)
主要实现方式:子类重写父类虚函数