1 标识符的作用域
标识符的作用域是其最进的一对大括号。
#include <iostream>
using namespace std;
int i; //在全局命名空间中的全局变量
namespace Ns {
int j; //在Ns命名空间中的全局变量
}
int main() {
i = 5; //为全局变量i赋值
Ns::j = 6; //为全局变量j赋值
{ //子块1
using namespace Ns; //使得在当前块中可以直接引用Ns命名空间的标识符
int i; //局部变量,局部作用域
i = 7;
cout << "i = " << i << endl;//输出7
cout << "j = " << j << endl;//输出6
}
cout << "i = " << i << endl; //输出5
return 0;
}
2 对象的生存期
static声明的局部变量生存期是整个程序
static语句只有最开始使用一次,a,b的值存储在内存中,第二次调用other使用上次other结束时的a,b值(a=4,b=4)。
#include <iostream>
using namespace std;
int i = 1; // i 为全局变量,具有静态生存期
void other() {
//a, b为静态局部变量,具有全局寿命,局部可见,只第一次进入函数时被初始化
static int a = 2;
static int b;
//c为局部变量,具有动态生存期,每次进入函数时都初始化
int c = 10;
a += 2;
i += 32;
c += 5;
cout << "---OTHER---" << endl;
cout << " i: " << i << " a: " << a << " b: " << b << " c: " << c << endl;
b = a;
}
int main() {
//a为静态局部变量,具有全局寿命,局部可见
static int a;
//b, c为局部变量,具有动态生存期
int b = -10;
int c = 0;
cout << "---MAIN---" << endl;
cout << " i: " << i << " a: " << a << " b: " << b << " c: " << c << endl;
c += 8;
other();
cout << "---MAIN---" << endl;
cout << " i: " << i << " a: " << a << " b: " << b << " c: " << c << endl;
i += 10;
other();
return 0;
}
3 静态数据成员、类成员初始化。
类成员初始化
const变量必须初始化。
静态数据成员的生命在类中,定义和初始化在类外
因为静态成员属于整个类,不属于某一对象。如果在类内初始化,会导致每个对象都包含该静态成员。
非静态成员函数也可以操作静态数据成员。
//5_4.cpp
#include <iostream>
using namespace std;
class Point { //Point类定义
public: //外部接口
Point(int x = 0, int y = 0) : x(x), y(y) { //构造函数
//在构造函数中对count累加,所有对象共同维护同一个count
count++;
}
Point(Point &p) { //拷贝构造函数
x = p.x;
y = p.y;
count++;
}
~Point() { count--; }
int getX() { return x; }
int getY() { return y; }
void showCount() { //输出静态数据成员
cout << " Object count = " << count << endl;
}
private: //私有数据成员
int x, y;
static int count; //静态数据成员声明,用于记录点的个数
};
int Point::count = 0; //静态数据成员定义和初始化,使用类名限定
int main() { //主函数
Point a(4, 5); //定义对象a,其构造函数回使count增1
cout << "Point A: " << a.getX() << ", " << a.getY();
a.showCount(); //输出对象个数
Point b(a); //定义对象b,其构造函数回使count增1
cout << "Point B: " << b.getX() << ", " << b.getY();
b.showCount(); //输出对象个数
return 0;
}
4 静态函数成员
用来处理属于整个类的静态数据
前面可以加类名 Point::,也可以加对象a. 或 b.
#include <iostream>
using namespace std;
class Point { //Point类定义
public: //外部接口
Point(int x = 0, int y = 0) : x(x), y(y) { //构造函数
//在构造函数中对count累加,所有对象共同维护同一个count
count++;
}
Point(Point &p) { //拷贝构造函数
x = p.x;
y = p.y;
count++;
}
~Point() { count--; }
int getX() { return x; }
int getY() { return y; }
static void showCount() { //静态函数成员
cout << " Object count = " << count << endl;
}
private: //私有数据成员
int x, y;
static int count; //静态数据成员声明,用于记录点的个数
};
int Point::count = 0; //静态数据成员定义和初始化,使用类名限定
int main() { //主函数
Point::showCount(); //输出对象个数
Point a(4, 5); //定义对象a,其构造函数回使count增1
cout << "Point A: " << a.getX() << ", " << a.getY();
Point::showCount(); //输出对象个数
a.showCount(); //输出对象个数
Point b(a); //定义对象b,其构造函数回使count增1
cout << "Point B: " << b.getX() << ", " << b.getY();
b.showCount(); //输出对象个数
Point::showCount(); //输出对象个数
return 0;
}
静态成员不能访问非静态成员
类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。
还未创建类的实例时,用静态成员去访问 内存中不存在的 非静态成员,当然是不可行的