专栏首页秘籍酷话说const修饰符与static修饰符

话说const修饰符与static修饰符

出自:彭磊 编程小小屋 链接:http://mp.weixin.qq.com/s/t6kA6UqZnQTOA687CvKCUA

1 C中的const和static:

这也是面试和笔试中经常会考到的问题,特别是static我面试了四家就考了两家,但是一般会放在前两题,属于特别基础的题目了。

const

const在C中代表定义一种“只读变量”,不可更改,譬如const int a = 10; 这时候a就不可以“直接”更改了。但是C由于类型的把控不是非常严格,我们依旧可以变相的去更改它,譬如:int *p = &a; *p = 20;

但是C++中类型的把控是非常严格的,无论如何,妄图修改const修饰的变量都是无意义的。

关于const结合指针的一点用法,例如:const int *p = &a; 那么此时就不可以利用指针p去修改a的值。还有int * const p = &a, 此时指针p就不可以修改指向,永久的只能指向a。这些都是基本的语法了。

static

static在c中的用法如下:

1、如果修饰的是局部变量,则他的生命周期会是整个程序运行开始到结束,并不会因为作用域等因素动态去释放。

2、如果修饰的是全局变量、全局函数等,则表示内部链接类型,只能本文件可见,其他文件不可见。

2 C++中的const:

const类成员数据

和普通变量一样,被const修饰之后为常量(只读)不可修改。并且只能在初始化列表中赋值(某些平台下可以支持类内赋值),可以被const和非const函数调用,但是一句话,绝不可修改!看例子:

class A

{

public:

A( ) : _value(100) {}

private:

const int _value;

};

const类成员函数

只需记住一句话,用const修饰的成员函数,承诺不会修改类内数据成员,那自然也不会在函数内部调用其他非const函数。看例子:

class A

{

public:

A( ) : _value(100) {}

void dis( ) const;

private:

const int _value;

};

void A::dis( ) const // 类外定义

{

cout << _value << endl;

}

记住他的语法格式,const要放在函数接口的末尾处。在类外定义的const函数时,定义处和声明出都要加上const。

const可以构成重载!直接看例子:

class A

{

public:

A( int _y) : x(100), y(_y) { }

void dis( ) const; // 对象调用时,优先调用

{

setY(5); // 错误!调用了非const函数

cout << "x: " << x << endl;

cout << "y: " << y << endl;

y = 50; // 错误!进行了写操作

}

void dis( ) // 非const重载函数

{

y = 200;

setY(100;

cout << "x: " << x << endl;

cout << "y: " << y << endl;

}

void setY(int data)

{

y = data;

}

private:

const int x;

int y;

};

int main(void)

{

A a(100);

const A b(200);

a.dis(); // 调用非const函数

b.dis(); // 调用const函数

return 0;

}

3 C++中的static:

在类内部把一个成员变量修饰为static,意味着这个变量属于类。什么意思呢?就是说这个类所实例化的所有对象,都共享着这一个static变量,他类似全局变量,但是比全局变量好的是,他并没有破坏封装的隐藏特性,只有本类的对象可以共享。类的静态成员,属于类,也属于对象,但终究属于类。

初始化:在类外初始化,语法规则是 数据类型 类名::静态数据成员 = 初值;

调用:两种方式

1) 类名::静态成员 2) 对象.静态成员

static类静态成员函数

为了管理静态成员,c++提供了静态函数,以对外提供接口。并静态函数只能访问静态成员。看例子:

class A

{

public:

static void appenVal(string data)

{

val += data;

}

static void show( )

{

cout << "val: " << val << endl;

}

private:

static string val;

};

string A::val = "My";

int main(void)

{

A a, b;

a.appendVal(" name ");

b.appendVal( " is ");

A::show( );

return 0;

}

这就是static的用法,来个小结:

1、static 成员变量实现了同簇类对象间信息共享。

2、static 成员类外存储,求类大小,并不包含在内。

3、static 成员是命名空间属于类的全局变量,存储在 data 区 rw 段。

4、static 成员使用时必须实始化,且只能类外初始化。

5、可以通过类名访问(无对象生成时亦可),也可以通过对象访问。

6、静态成员函数的意义,不在于信息共享,数据沟通,而在于管理静态数据成员,完成对静态数据成员的封装。

作者:彭磊,广西师大学生。

点击“阅读原文”近距离跟前摇滚吉他手兼主唱聊聊天。

本文分享自微信公众号 - 秘籍酷(mijiku040),作者:彭磊

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 多才多艺的const

    这样的global实际上是一个常量,这是C++用来取代宏定义的其中一种措施,const常量有类型检测,提高编译器的效率。

    用户2617681
  • C语言(关键字const)

    const是C语言中最坑爹的关键字,典型挂羊头卖狗肉,const本意是常量,但是C语言const只能用来定义只读变量。

    用户2617681
  • C语言(不明觉厉的cv限定词)

    以上对话虽然是杜撰的,但也绝非空穴来风,的的确确有类似的面试场景,我们不要笑话别人,也不能允许以后被别人笑话。比如上述对话中提到的cv限定词,现在就得立刻马上就...

    用户2617681
  • C++中const小结

    1、const修饰普通变量(非指针变量) const修饰变量,一般有两种写法: const TYPE value; TYPE const value; 对于一个...

    用户1215536
  • const特性总结(不断更新)

    作者:bakari  时间:2012.6.5 1、指向const对象的指针---const int *cptr; i、在此,cptr是指向int类型的const...

    CloudDeveloper
  • 学习c++中的小问题总结

    徐飞机
  • const关键字应用总结

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,通过查阅资料,将const作用归纳如下:

    C语言与CPP编程
  • Effective C++条款3 我可以不使用const?

    const是C++中用得非常频繁的一个关键字,但是如果你不使用这个关键字,对程序的运行结果影响不大,那么,我可以不使用const吗?

    ACM算法日常
  • C++雾中风景3:const用法的小结

    const关键字,翻译成中文是常量,常数的意思。所以在绝大多数场合之中,const是来定义常量的,定义常量也是好的编程习惯。在C类语言之中,定义常量通常会使用宏...

    HappenLee
  • 初级程序员面试不靠谱指南(二)

    3.read-only的const。如果你突然冒出一句看似很高深的话但又不解释一般都是装逼,就像前面提到过const准确的应该理解为一个read-only的变量...

    一心一怿

扫码关注云+社区

领取腾讯云代金券