话说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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券