面试6-----11 const和静态变量那些事儿
6 看看const和指针的那些事儿
const在int*左边
const在int*右边
const在int*两边------>请看代码注释
(1)代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 3 int main() 4 { 5 const int x = 1;//x为整形常量 6 int b = 20; 7 int c = 30; 8 9 const int* a1 = &b;//const在int*的左边 用来修饰指针指向的变量即指针指向的为常量 10 int* const a2 = &b;//const在int*的右边 用来修饰指针本身 即指针本身是常量 所以不能修改本身 11 const int* const a3 = &b;//const出现在int*的两侧 所以不仅本身不能修改 指向的内容也不可以修改 12 13 //x = 2;//这里报错 左值为常量 14 15 a1 = &c; 16 //*a1 = 1;//a1指向的内容不可以改变 17 18 //a2 = &c; 19 //*a2 = 1;//const在int*的右边 用来修饰指针本身 即指针本身是常量 所以不能修改本身 20 21 //a3 = &c; 22 //*a3 = 1; 23 return 1; 24 }
7 说明const与#define的特点与区别
(1)分别看看const和#define
1 #define a 10 2 int b; 3 b = 2*a;
#define:
a:编译器最开始的时候就会将#define a以后所有的代码中的a全部替换为10,然后进行编译
b:生命周期止于编译器,存在于程序的代码段,实际上就是一个常数
c:没有数据类型
const:
a:数据段,并分配了空间
b:有数据类型
c:可以进行安全性检查
8 c++中const有什么作用(至少三个)
(1)const定义的常量,编译器可以对其进行数据类型的安全检查
(2)const修饰函数形式参数 ,输入参数作为用户自定义类型和抽象数据类型是,将值传递改为const &传递可以提高效率
1 void func(A a) 2 void func(A const &a)
a:第一个函数会产生临时对象用于复制参数a,临时对象的构造 析构等都将消耗事件
b:引用传递不需要产生临时对象,但是只用a会改变a,所以加上const修饰
(3)const修饰函数的返回值:比如指针传递的函数返回值加const,返回就不能被直接修改,而且返回值只能被赋值给加const修改的同类型指针
1 const char *getchar(void){} 2 char *ch = Getchar();//error 3 const char *ch=Getchar();//correct
(4)const修饰类的成员函数,任何不修改数据成员的函数都应该加上const修饰(这样如果不小心修改了成员会报错提醒我们)
9 static的作用(至少两个)
(1) 函数体内,被申明为静态的变量,函数被调用的过程中都不会改变
(2)在整个模块内(函数体外),被申明的静态变量可以被模块内所有的函数访问,但是不能被模块外的访问,本地全局变量
(3)模块内,静态函数只能被这一模块内的其他函数调用。也就是这个函数被限制在声明它的模块的本地范围内使用(当前文件)
10static全局变量与普通的全局变量区别(c++)
(1)存储方式都一样------>静态存储方式
(2)static全局:限制了作用域,只能是定义变量的当前文件有效(如果源程序有多个文件)
普通全局:在各个原文件都有效
(3)static函数与普通函数作用域不同:
static函数:作用域本文件
总之:
(1) static全局与普通全局:
static全局只初始化一次,防止其他文件使用
(2)static局部和不同局部:
static局部变量初始化一次,下一次依据上一次结果值
(3)static函数与普通函数:
static函数在内存中只有一份,普通函数每次调用维持一份复制品
11 c++类的静态成员
1 #include <iostream> 2 using namespace std; 3 class widget 4 { 5 public: 6 widget() 7 { 8 count++; 9 } 10 ~widget() 11 { 12 --count; 13 } 14 static int num() 15 { 16 return count; 17 } 18 private: 19 static int count; 20 }; 21 int widget::count = 0; 22 23 int main() 24 { 25 widget x, y; 26 cout << "the num is" << widget::num() << endl; 27 if (widget::num() > 1) 28 { 29 widget x, y, z; 30 cout << "the num is" << widget::num() << endl; 31 } 32 widget z; 33 cout << "the num is" << widget::num() << endl; 34 return 0; 35 }
(1)首先类中的静态成员或者方法不属于类的实例
(2)count的值就是类widget实例的个数
(3)结果
25行中两个实例下x,y然后29行3个实例,但是出了代码块(也就是括号)就没有了,最后一个实例所以3个。
好了,今天的这部分任务结束(呜呜呜,今天电脑好卡!!!!!!),小伙伴加油