答案:
作用:告诉编译器该变量是容易发生变化的,不能对该变量进行优化,每次取值都必须从内存中取值而不是直接去取之前在寄存器中的值。
常见场景:
1)多线程使用共享变量:因为多线程是多核操作,同时进行。
2)中断:中断程序会修改其他程序中使用的变量。
3)硬件寄存器:因为寄存器随时会被修改,好比AD转换的寄存器,随时会因为电压变化而修改。
4)外部任务会修改变量。
答案:
C++中空结构体大小为1,C为0。
答案:
1)继承权限:class是默认private,struct是public;
2)访问权限:class作为对象的实现体,默认是私有访问,而struct是作为数据结构的实现体,是共有访问;
3) class可以用于定义模板,而struct不能。
答案:
?对于联合体所有的成员都共享一块内存,而结构体是所有变量内存的叠加,需要考虑字节对齐问题,对于联合体来说,只要你修改里面的成员的数据就会修改其他成员的数据,而结构体的成员数据是不影响的。
答案:
#define是C语言中定义的语法,是预处理指令,在预处理时进行简单而机械的字符串替换,不作正确性检查,只有在编译已被展开的源程序时才会发现可能的错误并报错。
typedef是关键字,在编译时处理,有类型检查功能。它在自己的作用域内给一个已经存在的类型一个别名,但不能在一个函数定义里面使用typedef。用typedef定义数组、指针、结构等类型会带来很大的方便,不仅使程序书写简单,也使意义明确,增强可读性。
答案:
(C中的变量:局部,函数形成,返回值,指针,typedef的区别,数组大小定义,case ??C++:常函数,常对象)
const int a;int const a;是一样的都是修饰变量a为常量
const * int a ; int const *a ; 修饰的是这个指针指向的内容不允许修改,这个指针的地址可以改变 常量指针
int * const a; 修饰的指针,表示这个指针的地址不可以修改,地址的内容可以修改 指针常量
const int * const a;表示指针的地址不可以修改,内容也不可以修改
C++中的const修饰的成员函数可以是虚函数,但是无法通过const修饰符来实现函数的覆盖
在C++类中有常函数的概念。void fun() const { ?}??像这种就是常函数,这种函数只能读取类中数据,不能修改
常对象。常对象只能调用常函数
const 修饰的变量存放位置。对于const修饰的局部变量:存放在栈中,代码结束就会释放,在C语言中可以通过指针修改里面的值。对于const修饰的全局变量(已初始化的)存放在只读数据段,不可以通过指针修改里面的值,未出示化的存放在.bss。
答案:
答案:
存在寄存器里面,即cpu,该值不能取地址操作,并且是整数,不能是浮点数。
答案:
一般情况下我们没有特别说明的局部变量都是默认为auto类型,存储在栈中。
答案:
1.定义变量
静态全局变量------>作用域只能作用于本文件,每次函数调用该变量都会被初始化。
静态局部变量----->生命周期不会随函数结束结束,直到程序结束,但是在函数外面不能使用该变量,只能在函数中使用,该变量是有记忆的,会记住上次的值,该变量只被初始化一次。
对于这两种变量来说,如果初始化的会在数据段内,未初始化的在.bss段或者初始化为0,这两种变量都会在程序结束才会释放,只不过作用域不同,静态局部变量只限定于函数中,但是该函数结束,该变量并没有被干掉,静态全局变量限定于本文件中。
2.定义函数
在函数返回类型前加上static关键字,函数即被定义为静态函数。静态函数只能在本源文件中使用;也就是说在其他源文件中可以定义和自己名字一样的函数。
3.定义类中的静态成员变量(不能在类里面初始化,不占类内存空间,必须定义才能使用)
在类中的静态成员变量它即可以被当做全局变量那样存储,但又被隐藏与类中,类中的静态成员变量拥有一块独立的储存空间,不会占用类中的空间,所有的对象都共享该静态成员,也就是说,只要有对象改变了这个值,那么其他对象就会受影响,该数据可以使用this,也可以类中其他函数访问。
注意:静态数据成员不能在类中初始化,在类中只是声明,而不是定义,静态数据必须要定义之后才能使用,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的。也不能在类的构造函数中初始化该成员,因为静态数据成员为类的各个对象共享,否则每次创建一个类的对象则静态数据成员都要被重新初始化。
4.定义类中的静态成员函数(只能访问静态成员变量)
静态成员函数也是类的一部分,而不是对象的一部分。所有这些对象的静态数据成员都共享这一块静态存储空间。
注意:静态成员函数不属于任何一个对象,因此C++规定静态成员函数没有this指针(划重点,面试题常考)。既然它没有指向某一对象,也就无法对一个对象中的非静态成员进行访问,即不能在静态函数里面使用this指针。
答案:
首先sizeof是关键字,strlen是函数,sizeof用来计算占用内存大小,strlen是用来计算字符串的长度。
特别是对于需不需要包含\0问题:
sizeof是需要给\0计算空间的,strlen是不需要;
sizeof是在编译的时候计算的,而strlen是在运行的时候计算;
sizeof计算的是数组的大小即数据类型*[];
strlen计算的是字符串长度;
答案:
1.首先new/delete是运算符,而malloc和free是函数;
2.new先为对象申请内存空间,然后再调用构造函数进行初始化,同理delete可以调用析构函数释放内存,而 malloc只是申请内存空间并不能调用构造函数进行初始化,同理free也只是释放内存;
3.malloc的返回值需要强转为自己申请的内存指针,而new不需要;
4.malloc需要指定申请内存的内存大小,而new是动态申请。