5.17C++:标识符作用域、对象生存期、静态数据成员、类成员初始化规则、静态函数成员、静态成员不能访问非静态成

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;
}

静态成员不能访问非静态成员

类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。

还未创建类的实例时,用静态成员去访问 内存中不存在的 非静态成员,当然是不可行的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值