出自:彭磊 编程小小屋 链接: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、静态成员函数的意义,不在于信息共享,数据沟通,而在于管理静态数据成员,完成对静态数据成员的封装。
作者:彭磊,广西师大学生。
点击“阅读原文”近距离跟前摇滚吉他手兼主唱聊聊天。