C和C++中static的用法
一、C语言中:
- static 修饰全局变量表示该变量只在本文件可用
static修饰局部变量,使得局部变量的生命周期的延长至程序结束
- static修饰函数表示该函数只在本文件可用,不能被外部文件引用
二、C++中:
静态成员变量 | 普通成员变量 |
---|
在类内声明时要加static修饰 | 不用加static |
在类外进行定义初始化 | 在构造函数的初始化列表进行初始化 |
不属于某个具体的实例,为所有类对象所共享 | 每个类对象都包含所有普通成员变量 |
可以通过类名::静态成员变量或对象名.静态成员变量名进行访问 | 只能通过对象名.普通成员名进行访问 |
因为静态成员变量不属于某个具体实例,所以不影响类的大小(sizeof) | 影响 |
存储位置在静态区 | 看在具体哪里创建 |
静态成员函数 | 普通成员函数 |
---|
不能访问普通成员变量,只能访问静态成员变量 | 既能访问普通成员变量,还能访问静态成员变量 |
因为没有隐藏的this指针,所以不能用const修饰函数 | 有this指针,可以根据情况用const修饰函数 |
可以通过类名::静态成员函数或对象名.静态成员函数名进行调用 | 只能通过对象名.静态成员函数名进行调用 |
静态成员函数只能调用静态成员函数,不能调用非静态成员函数 | 非静态成员函数既可以调用非静态成员函数也可以调用静态成员函数 |
三、友元:
- 友元函数提供了一种突破封装的方式,有时提供了便利,但是友元会增加耦合度,破坏了封装。
- 问题:对于重载cout、cint
友元函数的特点 |
---|
必须重载为全局函数 |
第一个参数必须为ostream&,第二个参数必须为类类型对象的引用 |
必须有返回值,方便连续输入输出 |
尽量不要在重载函数内部进行格式化操作(换行) |
其可以直接访问类的所有成员,包括私有成员 |
友元函数不属于任何类,但要在类的内部任何地方进行声明,并加上friend关键字,不受任何类访问限定符限制, |
友元函数不能用const修饰, |
一个友元函数可以是多个类的友元函数 |
class Date
{
public:
Date()
{
}
Date(int year, int month, int day)
:_year(year)
,_month(month)
,_day(day)
{
}
void Show()
{
cout << _year << '-' << _month << '-' << _day << endl;
}
static int GetCount()
{
return count;
}
private:
int _year;
int _month;
int _day;
static int count;
};
int Date::count = 10;
int main()
{
Date a;
a.Show();
Date b(2019, 10, 19);
b.Show();
cout << a.GetCount() << endl;
cout << Date::GetCount() << endl;
system("pause");
return 0;
}