21.C++内存分配方式有哪几种?
(1)栈(Stack)分配:
栈内存由编译器自动管理,用于存储局部变量、函数参数和返回地址等。
内存分配和释放速度快,因为在函数调用结束时自动释放。
空间相对有限,过大的数据结构可能导致栈溢出。
(2)堆(Heap)分配:
动态分配,使用new操作符分配内存,使用delete操作符释放内存。
需要手动管理内存,容易引发内存泄漏、悬挂指针等问题。
空间大,适合存储大量数据或不确定生命周期的对象。
(3)全局/静态存储区分配:
全局变量和静态变量存储在此区域,程序开始执行时分配,程序结束时释放。
全局变量对整个程序可见,静态局部变量在函数调用结束后依然存在,直到程序结束。
(4)常量存储区:
存储常量,如字符串字面量、const修饰的变量等。
这些数据在程序运行期间不可修改,且在程序生命周期内一直存在。
22.全局变量和局部变量的区别,操作系统和编译器是如何分辨它们的?
(1)生命周期不同:全局变量实在编译时创建,程序结束时销毁,临时变量在函数执行是分配空间,函数结束时销毁.
(2)作用范围不同:全局变量在整个代码中都可以使用,局部变量只能在所在的函数体中.
(3)存储位置不同:全局变量存放在数据区,局部变量存放在栈区.
操作系统和编译器是通过内存分配的位置来区分全局变量和局部变量的.
23.c++中explicit和protected是什么意思?
explicit和proctected都是关键字
explicit可以用来修饰类的构造函数,说明这个函数不接受类型的强制转化.
protected是类中的访问控制权限,可以修饰类中的成员,可以用来修饰继承.
修饰类的成员时候表示只有类的成员函数和类的派生类的成员函数可以访问.
24.重复fclose一个打开之后的FILE *fp指针会出现什么样的结果.
FILE是一个结构体,这个结构体是通过动态内存分配获取的.fclose的操作是释放动态内存分配的空间,多次调用,会出错.
25.为什么数组作为参数名的时候,数组的内容可以被改变,而单个数据作为参数名时,数据内容不会被改变?
数组作为参数时,传递的是数组的第一个参数的地址.通过地址,我们可以修改函数的值.而单个数据作为参数名,传递函数中的是一个形式参数,这个参数是对实参的拷贝,并不会对实参有任何影响.
26.你觉得如果不使用常量,直接在程序中填写数字或字符串,将会有什么麻烦?
1.程序的可读性差.程序员会忘记他们的含义。
2.容易发生错误。
3.不适合开发。
27.为什么要使用动态内存分配?,或者为什么要用堆空间.
只有运行时候.我们才知道一个对象需要多少的内存空间.而且我们也不知道对象的生存周期是多长.动态内存可以灵活的申请内存空间,并且可以动态的释放空间。
28.关键字const有哪些用法?
1.阻止一个变量的改变,用来修饰常变量。
2.对于指针来说,可以修饰指针,也可以修饰指针所指的值。
3.在函数声明中,表示一个形参的值不会改变。
4.修饰类的成员函数,表示这个函数不会修改其他成员的值。
29.是不是一个父类写了一个 virtual 函数,如果子类覆盖它的函数,不加 virtual , 也能实现多态?
virtual的函数是隐藏继承的,父类中声明为virtual函数,子类中也会被自动继承为virtual.所以可以加,也可以不加.
30.面向对象的三个基本特征,并简单叙述之
继承:子类,父类;子类拥有父类的属性,是对父类的扩充
封装:通过把使用抽象成类,然后实现类
多态:可以使用子类给父类进行赋值.
31.解释下面的词语,重载(overload),重写(覆盖override),重定义(隐藏redefinition)
重载:多个函数的名称一样,但是参数列表不一样.
重写:用于继承,子类重新定义父类中的虚函数.
重定义:用于继承,子类重新定义父类中的函数.重定义包括重写.
32.多态的作用是什么?
1.隐藏代码的细节,是代码能过模块化 (可以开放的函数可以是纯虚函数,通过动态联编的方式执行复杂的子类重写函数)
2.接口的重用,
33.如果ClassA中定义并且实现了虚函数int func(void),classB中也实现了这个函数,如果定义一个B的对象c,c.func()调用的是哪一个函数.如果A中的不是虚函数,情况又如何.
A * a = new B ;
因为是虚函数,所以调用的是B的函数。
如果不是虚函数,调用的是A的函数。
34.C++ 里面是不是所有的动作都是 main()引起的?如果不是,请举例。
不是,全局变量的定义,就是不再main中执行的.
35.内联函数和宏定义的区别是什么?
宏定义是由预处理阶段替换的,并不会检查参数列表,返回值类型.
内联函数是在编译器替换的,需要检查参数列表返回值之类的.他的作用是较少,调用程序过程中的上下文切换.
36.析构函数和虚函数的用法和作用?
析构函数是类中特殊的成员,他和构造函数一样,没有返回类型,而且没有参数,不能随意的被调用,无法重载,只有在类的生命周期结束的时候,由系统自动带哦用,释放内存空间.
虚函数是c++中多态的一种实现方式,通过使用虚函数,我们可以动态的绑定成员函数和对象.实现动态联编.
37.c++中什么是纯虚函数,什么是抽象类,什么是虚函数,有没有纯虚构造函数
纯虚函数是只有定义没有实现使用virtual声明的函数.
抽象类是含有纯虚函数的类,不能实例化成对象.
虚函数,用于动态联编,实现多态。
没有纯虚的构造函数.只有虚的构造函数。
38.c++中基类和派生类的构造函数,析构函数的执行顺序?
c++中构造是先执行基类的构造函数,然后在执行派生类的构造函数.
c++中析构函数是先执派生类的析构函数,然后在执行基类的析构函数.
40.c和c++的有不同的地方?
struct有很大的不同,不具有成员函数,不能继承.
c++中有内联函数,c中没有
c++中有bool类型,c中没有
c++中有引用,c中没有