嵌入式学习小组
直播中

神之小风

12年用户 803经验值
私信 关注

C++中的四种类型转换分别是哪些?C++中析构函数的作用是什么

C++中的四种类型转换分别是哪些?
C++中析构函数的作用是什么?在C语言中关键字static主要有何作用?

回帖(1)

李欣榕

2021-12-24 16:01:47
1、关键字static的作用是什么?

在C语言中,关键字static主要有三个作用:
1)在函数体,一个被声明为静态的变量在这一函数被调用的过程中维持其值不变。
2)在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所有函数访问,但不能被模块外的函数访问,它是一个本地的全局变量
3)在模块内,一个被声明为静态变量的函数只可被这一模块内的其它函数调用,那就是这个函数被限制在声明它的模块的本地范围内使用。
2、说一说C++中的四种类型转换

C++中的四种类型转换是:static_cast、dynamic_cast、const_cast、reinterpret_cast
1)const_cast
用于就将const变量转换为非const
2)static_cast
用于各种隐式转换,比如非const转const,void*转指针等,static_cast能用于多态向上转化,如果向下转能成功,但是不安全,结果未知。
3)用于动态类型转换。只能用于含有虚函数的类,用于层次间的向上和向下转化。只能转指针或引用。向下转化时,如果是非法的对于指针返回NULL,对于引用抛异常。要深入了解内部转换的原理。
向上转换:指的是子类向基类的转换
向下转换:指的是基类向子类的转换
它通过判断在指向到该语句的时候变量的运行类型和要转换的类型是否相同来判断是否能够进行向下转换。
4)reinterpret_cast
几乎什么都可以转,比如int转指针,可能会出问
题,尽量少用。
3、说说CC++中指针和引用的区别

1)指针是一个实体,而引用仅是个别名;
2)引用只能在定义时被初始化一次,之后不可变;指针可变;
3)引用没有const,指针有const,const的指针不可变;
4)引用不能为空,指针可以为空;
5)“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
6)指针和引用的自增(++)运算意义不一样;
7)引用是类型安全的,而指针不是 (引用比指针多了类型检查)
4、请回答一下数组和指针的区别



  • 从空间分配上来看,数组是静态内存分配,而指针是动态分配内存。
    2)从访问效率来看,数组是直接访问,而指针是间接访问的。
    3)安全性来看,数组容易造成越界,而指针容易造成内存泄漏
    4)从函数形参来看,传的数组名可以转化为指针。
    5)数组偏向于值的处理,而指针更偏向于地址的处理。
    6)数组分配的空间是连续的,而指针分配的空间未必是连续的。

5、在C++的基类中为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数

1)将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。
2)C++默认的析构函数不是虚函数是因为虚函数需要额外的虚函数表和虚表指针,占用额外的内存。而对于不会继承的类来说,其析构函数如果是虚函数,就会造成内存浪费。因此C++默认的析构函数不是虚函数,而是只有当需要当作父类时,设置为虚函数。
6、请你说一说你理解的虚函数和多态

答: 多态的实现主要分为静态多态和动态多态,静态多态主要是重载,在编译的时候已经确定;动态多态是用虚函数机制实现的,在运行期间动态绑定。
7、请你来说一下C++中析构函数的作用

析构函数和构造函数相对应,当对象结束其生命周期,系统将会自动调用析构函数。如果没有编写析构函数,系统将会自动生成一个缺省的析构函数,它不进行任何操作。一个类中如果有指针,且在使用的过程中动态申请了内存空间,最好显示析构函数在销毁类之前,释放掉申请的内存空间,不然会造成内存泄漏。
8、请你说一说strcpy和strlen

答: strcpy 是字符串拷贝函数,函数的原型是 stycpy(s1,s2),将 s2 拷贝到 s1 ,直到遇到 ‘’ 结束,如果 s1 小于s2 的长度,将会造成拷贝越界。
strlen 是计算字符串长度的函数,返回从开始到 ‘’ 之间的字符个数。
9、请你来说一说重载和重写

重载:在同一个作用域下,函数名相同,函数的参数不同
重写:在不用的作用域下,函数名相同,函数的参数不同
10、请你说说fork,wait,exec函数

父进程产生子进程使用fork拷贝出来一个父进程的副本,此时只拷贝父进程的页表,两个进程都读同一块内存,当有进程下写的时候使用写实拷贝机制分配内存,exec 函数可以加载一个elf 文件去替换父进程,从此父进程和子进程就可以运行不同的程序。Fork 从父进程返回子进程的pid,从子进程返回0.调用 wait 的父进程将会发出阻塞,直到有子进程的状态发生改变,执行成功返回0,错误返回 -1.exec 执行成功子进程从新的程序开始运行,无返回值,执行失败返回 -1。
11、请你来说一下C++里常量存放在内存的哪个位置?

答:对于局部变量,常量是存放在栈区,对于全局变量,常量存放在全局/静态存储区。对于字面值常量,存放在常量存储区。
12、请你来回答一下const修饰成员函数的目的是什么?

答:const修饰的成员函数表明函数调用不会对对象做出任何更改,事实上,如果确定不会对对象做更改,就应该为函数加上const限定,这样无论const对象还是普通对象都可以调用该函数。
13、请说一下C++ 和C语言的区别

在设计思想上:C++是面向对象的语言,而C语言是面向过程的结构化编程语言。
在语法上:C++具有封装、继承、多态三种特性
C++相比C,增加了许多类型安全的功能,比如强制类型转换
C++支持范式编程,比如模板类、函数模板
14、请你回答一下new/delete与malloc/free的区别是什么

1)new/delete能够自动计算分配的内存空间,而malloc/free需要手工计算字节数
2)new/delete是C++的关键字,而malloc/free是C语言的库函数
3)new调用构造函数,delete调用析构函数。而malloc/free不能
15、请你说一说select

答:select在使用前,先将需要监控的描述符对应的bit位置1,然后将其传给select,当有任何一个事件发生时,select将返回所有的描述符,需要在应用程序自动遍历去检查哪个描述符上有事件发生效率很低并且不断在内核态和用户进行描述的拷贝,开销很大。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分