C++之 静态方法2

  • -静态成员是所有对象共享的,所以不能在静态方法里访问非静态的元素。
  • -非静态方法可以访问类的静态成员,也可以访问类的非静态成员。

为什么?...

一、C++内存分配方式详解--堆、栈、自由存储区、全局/静态存储区和常量存储区

  1. 就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。
  2. 里面的变量通常是局部变量、函数参数等。
  3. 在一个进程中,位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数的调用。和堆一样,用户栈在程序执行期间可以动态地扩展和收缩。

就是那些由 new 分配的内存块,他们的释放 编译器不去管,由我们的应用程序去控制,一般一个 new 就要对应一个 delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。堆可以动态地扩展和收缩。

自由存储区

就是那些由 maloc 等分配的内存块,他和堆是十分相似的,不过它是用free 来结束自己的生命.

全局/静态存储区,

全局变量和静态变量 被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的(初始化的全局变量和静态变量在一块区域,未初始化的全局变量与静态变量在相邻的另一块区域,同时未被初始化的对象存储区可以通过 void* 来访问和操纵,程序结束后由系统自行释放),在 C++ 里面没有这个区分了他们共同占用同一块内存区。

常量存储区

这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多

 二、再论 this 指针

  • this 指针是类的一个自动生成、自动隐藏的私有成员,它存在于类的非静态成员函数中,指向被调用函数所在的对象的地址。
  •  当一个对象被创建时,该对象的 this 指针就自动指向 对象数据的首地址
#include

class Point
{
private:
  int x, y;
public:
  Point(int a, int b)
	{ 
		x = a;
		y = b;
	}
  void MovePoint( int a, int b)
	{ 
		x = a; 
		y = b;
	}
  void print()
	{ 
		std::cout << "x=" << x << "y=" << y << endl;
	}
};

int main()
{
  Point point1(10, 10);
  point1.MovePoint(2, 2);
  point1.print();

	return 0;
}

// 当对象point1调用MovePoint(2,2)函数时,即将point1对象的地址传递给了this指针。

// MovePoint函数的原型事实上应该是 void MovePoint( Point *this, int a, int b);
// 第一个参数是指向该类对象的一个指针,我们在定义成员函数时没看见是因为这个参数在类中是隐含的。

// 这样point1的地址传递给了this,所以在MovePoint函数中便可以显式的写成:void MovePoint(int a, int b) { this->x = a; this->y = b;} 
// 即可以知道,point1调用该函数后,也就是point1的数据成员被调用并更新了值。
  • 在任何一个方法里都可以使用 this 指针。从本质上讲, C++ 中的对象其实是一种特殊的结构 --除了变量,还包含着一些函数的特殊结构
  •  在程序运行时,对象的属性(变量)和方法(函数)都是保存在内存里,这就意味着它们各自都有与之相关联的地址。这些地址都可以通过指针来访问,而 this 指针毋庸置疑是保存着对象本身的地址。
  • 每当我们调用一个方法的时候, this 指针都会随着你提供的输入参数被秘密的传递给那个方法。
  • 正是因为如此,我们才能在方法里像使用一个局部变量那样使用 this 指针
  • 因为静态方法不是属于某个特定的对象,而是由全体对象共享的,这就意味着它们无法访问 this指针。
  • 所以,我们才无法在静态方法里访问非静态的类成员(因为非静态的类成员需要用到隐含的this指针来访问)。

三、使用静态属性时,需注意:

  • 在使用静态属性的时候,千万不要忘记为它们分配内存。具体做法很简单,只要在类声明的外部对静态属性做出声明(就像声明一个变量那样)即可
  • 静态方法也可以使用一个普通方法的调用语法来调用,但建议不要这么做,那会让代码变得更糟糕!

        • 请坚持使用: ClassName::methodName();
        • 请不要使用: objectName.methodName();


未完待续。。。

你可能感兴趣的:(c++,c++)