面试6-----11 const和静态变量那些事儿

6 看看const和指针的那些事儿

  const在int*左边

       const在int*右边

  const在int*两边------>请看代码注释

(1)代码

 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 }
View Code

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个。

好了,今天的这部分任务结束(呜呜呜,今天电脑好卡!!!!!!),小伙伴加油

原文地址:https://www.cnblogs.com/lanjianhappy/p/7904459.html