A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 善良的禽兽 中级黑马   /  2015-9-30 07:48  /  387 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文




[url=]1 static的理解[/url]
  • [url=]2 const 新自定义类型 p; 则p不可变[/url]
  • [url=]3 不可重入函数[/url]
  • [url=]4 类的static成员变量[/url]
  • [url=]5 类的const成员变量[/url]
  • [url=]6 类的static const成员变量[/url]


1 static的理解理解
  • 变量被存储在全局存储区里,可以下次调用的时候仍旧保持原来的值,这是与堆栈变量的区别。
  • 变量前static告知编译器,此变量仅在变量的作用范围内有效,这是与全局变量的区别。
一个选择题
关于static变量,请选择下面所有说法正确的内容:
  • 若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
  • 若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
  • 设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;
  • 静态全局变量过大,可那会导致堆栈溢出。
答案与分析
对于A,B:根据本篇概述部分的说明b),我们知道,A,B都是正确的。

对于C:根据本篇概述部分的说明a),我们知道,C是正确的(所谓的函数重入问题,下面会详细阐述)。

对于D:静态变量放在程序的全局数据区,而不是在堆栈中分配,所以不可能导致堆栈溢出,D是错误的。

因此,答案是A、B、C。


2 const 新自定义类型 p; 则p不可变
#include <iostream>using namespace std;typedef char* pchar;int main(){        char str[10] = "abcdef";        const char* p1 = str;        const pchar p2 = str;        p1++;        p2++;        return 0;}
上面程序出错的原因
const char* p1 = str; 其中p1是可变指针指向不可变的字符串。所以p1++正确。

typedef char* pchar; 定义了一种新类型,所以 const pchar p2; p2是const类型的,所以p2++出错。


3 不可重入函数所谓可重入函数就是结果可预测(即只要输入数据相同,输出结果就相同)。

下面的函数就不是可重入函数,因为static的缘故。

unsigned int sum_int( unsigned int base){          unsigned int index;          static unsigned int sum = 0; // 注意,是static类型的。          for (index = 1; index <= base; index++)                   sum += index;          return sum; }


4 类的static成员变量
class A{public:    static int cnt;    A(){cnt++;}    static int how_many_instance(){        return cnt;    }};int A::cnt = 0;         //类的static成员变量必须在类外初始化,并且在加上其类型和类名::int main(){    cout<<A::how_many_instance()<<endl;    A a, b, c, d;    cout<<A::how_many_instance()<<endl;    return 0;}


5 类的const成员变量类的const成员变量只能以初始化列表的形式初始化

class A{public:    const int a;    A(){a=0;}};class A{public:    const int a;    A():a(10){}};上面程序第一个报错,因为类的const成员变量只能以初始化列表的形式初始化。


6 类的static const成员变量static const变量与static变量初始化方式一样

class A{public:    static const int a;};const int A::a = 0;static const变量与static变量初始化方式一样,只是前者在变量名前加上const。




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马