static关键字 1、全局静态变量、局部静态变量 2、静态函数。只能在本源文件 中使用 3、c++中,static关键字可以定义类 中的静态成员变量。类中static静态数据成员拥有一块独立的单独存储区,而不管创建了多少个该类的对象。这些对象共享这一块静态存储区。 4、c++中,static关键字可以定义类 中的静态成员函数。静态成员函数也是类的一部分,而不是对象的一部分。这些对象共享这一块静态存储区数组和指针的区别 1、数组是用来存储多个相同类型的集合。数组名是首元素的地址。 2、指针相当一个变量,它存放的是其他变量在内存中地址。指针名只想内存的首地址。 区别: 1、赋值 2、存储方式: 数组:连续存放、连续内存。不是在静态区就是在栈上。 指针:灵活、内存空间不确定。 3、初始化 4、指针操作 数组名的指针操作:函数指针 定义:指向函数的指针。 应用:回调静态变量什么时候初始化 c语言:全局或者静态变量,初始化发生在任何代码执行之前,属于编译期初始化。 c++:全局或者静态对象当且仅当对象首次用到时才进行构造。 解析: 作用域 :C++里作用域可分为6种: 全局 , 局部 , 类,语句 , 命名空间 和 文件作用域 。 静态全局变量 :全局作用域+文件作用域,所以无法在其他文件中使用。 静态局部变量 :局部作用域,只被初始化一次,直到程序结束。 静态局部变量 :局部作用域,只被初始化一次,直到程序结束 生命周期 :静态全局变量、静态局部变量都在静态存储区,直到程序结束才会回收内存。类静态成员变量在静态存储区,当超出类作用域时回收内存。 nullptr调用成员函数可以吗?为什么 答:能。 原因:因为在 编译时对象 就绑定了 函数地址 ,和指针空不空没关系。 说说什么是野指针,怎么产生的,如何避免? 定义:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的) 产生原因:释放内存后指针不及时置空(野指针),依然指向了该内存,那么可能出现非法访问的错误。这些我们都要注意避免。 避免办法: 1、初始化置为NULL; 2、申请内存判空; 3、指针释放后置空; 4、使用智能指针;说静态局部变量,全局变量,局部变量的特点,以及使用场景 1、首先从作用域考虑 :C++里作用域可分为6种: 全局 , 局部 , 类 , 语句 , 命名空间 和 文件 作用域。 全局变量 :全局作用域,可以通过 extern 作用于其他非 定义的源文件 静态全局变量 :全局作用域+文件作用域,所以 无法在其他 文件中使用。 局部变量 :局部作用域,比如函数的参数,函数内的局部变量等等。 静态局部变量 :局部作用域,只被 初始化一次,直到程序结束 2、从所在空间考虑 :除了 局部变量在栈上 外,其他都在静态存储区。因为静态变量都在静态存储区,所以下次调用函数的时候还是能取到原来的值。 3、生命周期 : 局部变量在栈上,出了作用域就回收内存 ;而全局变量、静态全局变量、静态局部变量都在静 态存储区,直到程序结束才会回收内存。 说说内联函数和宏函数的区别 区别: 1、宏不是函数 ,省去压栈退栈过程,提高效率。内联函数本质是一个函数 ,并且内联函数本身不能直接调用自身。 2、宏函数 是在预编译的时候把所有的宏名用宏体来替换,简单的说就是字符串替换。 而内联函数 则是在编译的时候进行代码插入,编译器会在每处调用内联函数的地方直接把内联函数的内容展开,这样可以省去函数的调用的开销,提高效率。 3、宏定义 是没有类型检查的,无论对还是错都是直接替换; 而内联函数 在编译的时候会进行类型的检查,内联函数满足函数的性质,比如有返回值、参数列表等。 运算符i++和++i的区别 1、赋值顺序不同 :++ i 是先加后赋值;i ++ 是先赋值后加;++i和i++都是分两步完成的。 2、效率不同 :后置++执行速度比前置的慢 3、i++ 不能作为左值,而++i 可以 4、两者都不是原子操作