Cherno C++ P22 C++类和结构体中的静态(static)

C++类和结构体中的静态(static)

YouTube视频链接
本文是ChernoP22视频的学习笔记。
  前文提到了static关键字在C++中的两个含义,讨论了类或结构体外部使用static关键字。本文将接着讨论在类或结构体中的static关键字。
  静态在一个类中意味着特定的东西,把它和变量一起使用,这样在类的所有实例中,这个变量就只有一个实例。
  Main.cpp代码如下,输出2,3和5,8。

#include

struct Entity
{
	int x, y;

	void Print()
	{
		std::cout << x << "," << y << std::endl;
	}
};

int main()
{    
	Entity e;
	e.x = 2;
	e.y = 3;

	Entity e1 = { 5,8 };

	e.Print();
	e1.Print();
	
	std::cin.get();
}

  如果让变量变成静态的,e1的初始化会失败,因为x,y不再是类成员。
Cherno C++ P22 C++类和结构体中的静态(static)_第1张图片
Cherno C++ P22 C++类和结构体中的静态(static)_第2张图片  我们可以写上int Entity::x和int Entity::y,先写上作用域Entity,再写变量名x/y。这样连接器可以链接到合适的变量,然后我们运行代码。
Cherno C++ P22 C++类和结构体中的静态(static)_第3张图片  我们发现打印了两次5,8。因为当x,y变量为静态时,这两个变量在Entity类的所有实例中只有一个实例,当我改变第二个Entity实例的x和y时,它们实际上和第一个完全一样,它们指向的是相同的内存。
  我们也可以这样引用它们,就像它们在这个Entity作用域内。意味着我们在名为Entity的命名空间中创建了两个变量,它们并不属于类。但我们还是在修改相同的变量。
Cherno C++ P22 C++类和结构体中的静态(static)_第4张图片  如果我们把print方法变成静态,它会正常工作,因为它指向的变量x,y也是静态变量。但它会打印出相同的东西,因为我们运行了两次相同的方法。
Cherno C++ P22 C++类和结构体中的静态(static)_第5张图片  如果我们让x,y变量是非静态的,这样对Entity类的每个实例都有一个单独的x和y,print方法仍然保持static。但静态方法不能访问非静态变量。
Cherno C++ P22 C++类和结构体中的静态(static)_第6张图片  因为静态方法没有类实例。本质上在类中写的每一个方法,每一个非静态方法总是获得当前类的一个实例作为参数,这是类在幕后的实际工作方法。它们通过隐藏参数发挥作用,静态方法不会得到那个隐藏参数。静态方法与在类外部编写方法相同。
  在外面写一个print方法,因为不知道变量x,y是啥,所以不能访问。
Cherno C++ P22 C++类和结构体中的静态(static)_第7张图片  想象有同样的print方法,但是有一个Entity对象,是作为参数传入的,就不会出现错误。
Cherno C++ P22 C++类和结构体中的静态(static)_第8张图片  这个例子本质上是非静态类方法在编译时的样子,如果我们把Entity实例去掉,正是我们将static关键字添加到类方法时所做的。
Cherno C++ P22 C++类和结构体中的静态(static)_第9张图片  发现出错了,因为不知道要访问哪个Entity的x和y,我们没有给它一个Entity的引用。

你可能感兴趣的:(C++,c++,开发语言,后端)