前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >话说const修饰符与static修饰符

话说const修饰符与static修饰符

作者头像
用户2617681
发布2019-08-08 14:51:18
9250
发布2019-08-08 14:51:18
举报
文章被收录于专栏:秘籍酷

出自:彭磊 编程小小屋 链接: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;

}

代码语言:javascript
复制
这就是static的用法,来个小结:

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

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

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

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

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

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秘籍酷 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档