EchoDemo's Blogs

C++中的问题整理(二)

1、成员方法又称为实例方法,静态方法又称为类方法。静态方法中没有this指针。

2、this指针内容为const,是不允许更改的。如果对它进行了更改将会导致编译不成功,如果只有delete this;这一句存在于析构函数当中,则能通过编译,但是会导致栈的溢出。

3、构造函数初始化时必须采用初始化列表的一共有三种情况

(1)需要初始化的数据成员是对象(继承时调用基类构造函数)

(2)需要初始化const修饰的类成员

(3)需要初始化引用成员数据

*由于static属于类并不属于具体的对象,所以static成员是不允许在类内初始化的。static const成员也不在初始化列表中。

*static属于类,它在未实例化的时候就已经存在了,而构造函数的初始化列表,只有在实例化的时候才执行。

*static成员不属于对象。我们在调用构造函数自然是创建对象,一个跟对象没直接关系的成员没有必要初始化。

4、实参可以是任何类型(可以是常量,变量或表达式),但是形参却不能是表达式。C语言中最简单的数据类型包括整型、实型(实型又称浮点数或者实数)、字符型。在C语言中,没有专门的逻辑型数据类型,而是用0和1来表示逻辑值。

5、类的大小只与成员变量(非static数据成员变量)和虚函数指针有关,还要考虑到对齐。基类中存在虚函数时,派生类会继承基类的虚函数(虚函数也是类的成员函数),因此派生类中不再增加虚函数的存储空间(因为所有的虚函数共享一块内存区域),而仅仅需要考虑派生类中添加进来的非static数据成员的内存空间大小。(指向虚函数的指针为4个字节)

6、fork()与clone的区别

函数复制时将父进程的所有资源都通过复制数据结构进行了复制,然后传递给子进程,所以fork()函数不带参数;clone()函数则是将部分父进程的资源的数据结构进行复制,复制哪些资源是可以通过参数设定选择的,所以clone()函数带参数,没有复制的资源可以通过指针共享给子进程。

7、关于浅复制和深复制

所谓浅复制,就是在构造函数当中直接为复制的对象的数据成员赋值。在很多情况下,这是可以的。创建新的对象,要为对象的数据成员分配存储空间,直接赋值就将值保存在相应的空间中。但是如果在构造函数当中出现了指针类型的数据成员时,也按照上面那样直接赋值而未经过地址的分配就会在调试的时候出错,这种指针被称为“野指针”。解决这样的问题的方法,就是在构造函数中,为指针类型的成员,分配专门的空间。以这条规则构建的复制,称作为深复制。

8、C语言中的未定义行为(Undefined Behavior)

未定义行为是指C语言标准未做规定的行为。同时,标准也从没要求编译器判断未定义行为,所以这些行为有编译器自行处理,在不同的编译器可能会产生不同的结果,又或者如果程序调用未定义的行为,可能会成功编译,甚至一开始运行时没有错误,只会在另一个系统上,甚至是在另一个日期运行失败。当一个未定义行为的实例发生时,正如语言标准所说,“什么事情都可能发生”,也许什么都没有发生。

9、C++面向对象的三个基本特征(封装、继承和多态)

(1)封装:将客观事物抽象成类,每个类对自身的数据和方法实行。封装是实现信息隐蔽的一种技术,其目的是使类的定义和实现分离。

(2)继承:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

(3)多态:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。在程序运行时的多态性通过继承和虚函数来体现;在程序编译时多态性体现在函数和运算符的重载上。同时又有这些多态的形式,参数多态:指参数方面,包含函数模板与类模板;包含多态:含有virtual关键字;重载多态:函数名相同,但函数参数的个数或类型不同构成多态;强制多态:通过强制类型转换形成;重载多态和强制多态是指特定多态。参数多态和包含多态是指通用多态。

*封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态则是为了实现接口重用!

10、虚函数如何实现的

(1)虚函数是通过一张虚函数表实现的,有多少个虚函数,就有多少个指针。

(2)在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承、覆盖的问题。

(3)实际上在编译的时候,编译器会自动加上虚表。

(4)虚函数的作用实现动态联编,也就是说在程序运行阶段动态的选择合适的成员函数,在定义了虚函数之后,可以在基类的派生类中对虚函
数重新定义。

(5)虚表的使用方法是如果派生类在自己定义中没有修改基类的虚函数,我们就指向基类的虚函数;如果派生类改写了基类的虚函数,这时续
表则将原来指向基类的虚函数的地址替换为指向自身虚函数的指针。

(6)必须通过基类类型的引用或指针进行函数调用才会发生多态。
🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------