day9
1.简述c语言和c++的区别?
1)c语言是面向过程的语言,是结构化语言,考虑如何通过一个过程对输入进行处理来得到输出的结果;c++是面向对象的语言,主要特征是“封装、继承和多态”,封装就是以及隐藏内部的实现细节,使得代码模块化。继承就是派生类可以继承父类的数据和方法,扩展了父类中以及存在的模块,实现了代码的重用。多态就是“一个接口,多种实现”,通过派生类重写父类的虚函数,实现了接口的重用,
2)c和c++中动态管理内存的方式不一样,c是用malloc/free,而c++是用new和delete关键字
3)c++中有引用,c中不存在引用的概念
2.指针和引用的区别?
1)指针可以被重新赋值给另外一个不同的对象,而引用总是指向在初始化指定的对象,以后不能改变,但是指向的对象的内容可以改变
2)从内存内配上看,程序为指针变量分配内存空间,而不为引用分配内存,引用初始化时必须指向一个对象,引用与这个对象共享内存空间。
3)从编译上看,程序在编译时分别将指针和引用添加到 符号表上,符号表上记录的是变量名及变量所对应地址。指针变量在符号表上对应的地址值为指针变量的地址值,而 引用在符号表上对应的地址值为 引用对象的地址值。符号表生成后就不会再改,因此指针可以改变指向的对象(指针变量中的值可以改),而引用对象不能改。这是使用指针不安全而使用引用安全的主要原因。从某种意义上来说 引用可以被认为是不能改变的指针。
4)不存在指向空值的引用这个事实,意味着使用引用的代码效率比使用指针的要高。因为在使用引用之前不需要测试它的合法性。相反,指针则应该总是被测试,防止其为空。
5)理论上,对于指针的级数没有限制,但是引用只能是一级。如下:
int** p1; // 合法。指向指针的指针
int*& p2; // 合法。指向指针的引用
int&* p3; // 非法。指向引用的指针是非法的
int&& p4; // 非法。指向引用的引用是非法的
注意上述读法是 从左到右
3.结构体和共同体的区别?
结构体:将不同类型的数据组合成一个整体,是自定义类型
共同体:不同类型的几个变量共同占用一段内存
结构体中的每个成员都有自己独立的地址,他们是同时存在的
共同体中的成员占用同一段内存,他们不能同时存在
sizeof(struct)是内存对齐后所有成员长度的总和,sizeof(union)是内存对齐后最长数据成员的长度、
4.#define和const的区别?
1.define定义的常量没有类型,是个立即数,const定义的常量有类型名字,存放在静态区域
2.处理阶段不同,#define定义的宏变量在预处理时进行替换,可以有多个拷贝,const定义的变量在编译时确定值,只有一个拷贝
3.#define定义的常量不可以用指针去指向,而const定义的常量可以用指针去指向
4.#define可以定义简单的函数,而const不可以定义简单的函数
5.new、delete和malloc、free的区别?
1)malloc对分配的内存空间大小严格规定的,而new不需要
2)new为对象开辟空间时,会调用对象的构造函数,delete为对象释放空间时,会调用析构函数
6.delete和delete[]的区别?
delete只会调用一次析构函数,delete[]会调用每个成员的析构函数;用new开辟的内存用delete释放,用new[]开辟的内存空间用delete[]释放
7.c++中关键字static的作用?
1.在函数体内:static修饰的局部变量作用范围在该函数体内,他的内存只会分配一次,下次调用时会维持这个值。
2.在模块内,static修饰全局函数或者全局变量,可以被模块内的所有函数访问,但是不能被模块外的函数访问,使用范围在这个模块内
3.在类中,修饰成员变量,表示该变量为整个类所有,对类的所有对象只有一份拷贝。
4.在类中,修饰成员函数,表示该成员函数为整个类所有,不接受this指针,只能访问类中的static成员
5.static 类对象必须要在类外进行初始化,static 修饰的变量先于对象存在,所以static 修饰的变量要在类外初始化;
简述c++中定义与声明的区别?
C语言通过extern进行程序单元的声明。
一些程序单元(函数、结构体)在声明时可以省略extern。
严格意义上的声明和定义并不相同。
简述c++的内存管理机制?
在c++中,内存分为5个区,他们分别是堆区,栈区,自由存储区,全局/静态存储区和常量存储区。
栈区,在执行函数时,函数内部局部变量的创建都在栈上,当函数执行结束后,这些内存单元就会被释放。
堆区,就是指那些用new分配的内存块,并且内存的释放由应用程序去控制,如果程序员没有释放掉,则程序结束后,操作系统回收
自由存储区,和堆区十分相似,不过它是由malloc分配内存的,释放用delete
全局/静态存储区,存储全局变量和静态变量的区域
常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。
构造函数为什么不能被声明为虚函数,而析构函数会被声明为虚函数?
构造函数不能声明为虚函数的原因:1)因为创建一个对象时需要知道这个对象的类型,而在构建一个对象时,由于对象还未创建成功,并不能知道对象的实际类型
2)虚函数的调用需要虚函数表指针,这个指针存放在该对象的内存空间中,如果构造函数声明为虚函数,由于对象还没有创建,还没有内存空间
c++静态绑定和动态绑定?
对象的静态类型和动态类型:
静态类型:对象在声明时所采用的类型,在编译时确定
动态类型:当前对象所指的类型,在运行期决定,对象的动态类型可变,在运行时决定
静态绑定和动态绑定
静态绑定:绑定的时对象的静态类型,在编译器确定
动态绑定:绑定的是对象的动态类型,在运行时决定
深拷贝和浅拷贝:
浅拷贝:将原对象或者原数组的引用直接赋给新对象或者新数组,新对象/新数组只是元对象/原数组的一个引用
深拷贝:创建一个新的对象/数组。将原对象的各项属性的值拷贝过来,是值而不是引用,深拷贝会在堆内存中另外申请空间来村塾数据,当数据成员中由指针时,必须用深拷贝
c++中extern“c”的作用?
extern“c”的主要作用就是为了c++代码正确调用其他c语言代码,加上ectern“c”后,这部分代码就会按照c语言进行编译
c++中typedf和define的区别?
#define是预处理命令,在预处理只是简单的替换,并不会进行类型的检查;
typedf是在编译时处理的,他是在自己的作用域内给已经存在的类型一个别名
什么叫野指针?
野指针就是指向不可用的内存区域的地址,造成野指针的原因主要是指针使用的时候没有初始化的原因。
友元函数和友元类?
1.友元函数可访问类的私有和保护成员,但不是类的成员函数
2.友元函数不能用const修饰
3.友元函数可以在类定义的任何地方声明,不受类访问限定符限制
4.一个函数可以是多个类的友元函数
由干友元函数不是类的成员,所以没有this指针,访问该类的对象的成员时,必须使用对象名,而不能直接使用类的成员名。
虽然友元函数是在类中说明的,但其名字的作用域在类外,作用域的开始点在说明点、结束点和类名相同。因此,友元说明可以代替该函数的函数说明。
友元类的所有成员函数都可以是另一个类的友元函数,都可以访问另一个类中的非公有成员。
友元关系是单向的,不具有交换性。
友元关系不能传递->如果B是A的友元,C是B的友元,则不能说明C时A的友元。
简述const的成员函数的理解?
const Stock & Stock::topval (②const Stock & s) ③const
const修饰函数的返回值,确保返回的函数返回值在以后的使用过程中不会被改变
const修饰形参,确保不会修改传递的参数
const,确保此方法不修改调用他的对象,const对象只能调用const成员函数,不能调用非const成员函数
int *const p2中const修饰p2的值,所以理解为p2的值不可以改变,即p2只能指向固定的一个变量地址,但可以通过*p2读写这个变量的值。顶层指针表示指针本身是一个常量
int const *p1或者const int *p1两种情况中const修饰*p1,所以理解为*p1的值不可以改变,即不可以给*p1赋值改变p1指向变量的值,但可以通过给p赋值不同的地址改变这个指针指向。底层指针表示指针所指向的变量是一个常量。
解释一下常量指针和指针常量?
常量指针就是指针指向的地址不能改变,但是可以通过指针修改对应的值;指针常量就是指针指向的地址可以改变,但是指针指向的内容不可以改变。
简述strlen和sizeof的区别?
1.sizeof是一个操作符,strlen是一个库函数
2.sizeof的参数可以是类型和变量,而stlen的参数只能是以\0结尾的字符串
3.编译器在编译时就能计算出sizeof的结果,而strlen要在运行时才会才能算出来,并且sizeof计算的是数据类型的大小,strlen计算的是字符串实际的大小。
4.数组做sizeof不退化,传递给strlen会退化成指针
c++指针可以用volatile来修饰吗?
可以,因为指针和普通变量一样,有时也有变化程序的不可控性。常见例:子中断服务子程序修改一个指向一个 buffer 的指针时,必须用 volatile 来修饰这个指针。
说明:指针是一种普通的变量,从访问上没有什么不同于其他变量的特性。其保存的数值是个整型数据,和整型变量不同的是,这个整型数据指向的是一段内存地址。
简述strcpy、sprintf、memcpy的区别?
1.操作对象不同,strcpy的两个操作对象都是字符串,sprintf 的操作源对象可以是多种数据类型,目的操作对象是字符串,memcpy的两个操作对象是两个任意可操作的地址,并不限于何种形式。
2.执行效率不同,memcpy最高,strcpy次之,memcpy最低
3.实现功能不同,strcpy实现的功能是两个字符串之间的拷贝,sprintf实现的是其他数据类型到字符串数据类型的转变,memcpy 主要是内存块间的拷贝。
拷贝构造函数和赋值运算符的区别?
1.拷贝构造函数生成新的类对象,而赋值运算符不能
2.由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象是否和新建对象相同。而赋值运算符则需要这个操作,另外赋值运算中如果原来的对象中有内存分配要先把内存释放掉
3.注意:当有类中有指针类型的成员变量时,一定要重写拷贝构造函数和赋值运算符,不要使用默认的
c++中链表和数组有什么区别?
1.存储形式:数组是一块连续的空间,声明时就要确认长度,链表是一块不可连续的内存空间,长度可变,每个节点要保存相邻节点指针
2.查找:数组的线性查找效率速度更高,查找操作使用偏移地址,链表需要按顺序检索节点,效率低
3.数据插入和删除:链表可以快速插入和删除节点,而数组则需要大量偏移数据
4.越界问题:链表不存在越界问题,而数组存在越界问题。
浙公网安备 33010602011771号