一:在类中的的静态成员,存放在代码段,编辑器并不给该段的数据分配空间,只是记录数据所需空间的大小。数据段存放经过初始化的全局和静态变量。
#include <iostream>
using namespace std;
// 静态成员变量 static
// 1、静态成员不属于某个对象,是类的属性,是所有对象共享的属性
// 2、静态成员变量必须在类的外部进行初始化
// 3、静态成员 可以通过类名直接使用
// 静态的成员函数:只能使用静态成员,不能使用类的普通成员
class Test
{
public:
void show()
{
printf ("a = %d, b = %d, sa = %d\n", _a, _b, _sa);
}
static void print()
{
// show();
printf ("sa = %d\n", _sa);// 静态的成员函数:只能使用静态成员,不能使用类的普通成员
}
public:
int _a;
int _b;
static int _sa;//静态变量在数据区不占用空间
};
int Test::_sa = 10;// 2、静态成员变量必须在类的外部进行初始化
int main1()
{
cout << sizeof(Test) << endl;//int类型占用4个字节,而静态变量不占用所以是8个字节
Test t1, t2;
cout << t1._sa << endl;//作为静态变量类的属性,类中所有成员使用同一个静态变量
cout << t2._sa << endl;//所有给对象t1的sa赋值就等于给t2的sa赋值
t1._sa = 123;//给t1的sa赋值等于给其他成员的sa赋值
cout << t2._sa << endl;
cout << Test::_sa << endl;// 3、静态成员 可以通过类名直接使用
t1._a = 1;
t1._b = 2;
t1.show();
Test::print();
return 0;
}
class Test1
{
private:
Test1(){}//私有构造函数,
public:
static Test1 *create()
{
Test1 *pt = new Test1;//新建一个test1类型的空间,初始化指针Pt1
return pt;//在成员函数内可以使用私有函数,new的过程会自动调用构造函数
}
};
int main()
{
//Test1 t;//私有构造函数不能创建对象
Test1 *t1 = Test1::create();//这里创建一个指针,被指针Pt的地址赋值(静态函数成员可以直接类调用)
//由于静态函数调用不需要对象,直接用类调用,所以可以通过静态函数达到创建对象调用构造函数的效果
return 0;
}
二:this指针
this在成员函数的开始执行前构造的,在成员的执行结束后清除。
类中所有普通成员函数都有一个指向当前对象的常指针,c++有一个关键字this ,专门用来表示这个指针
在类的普通成员函数,可以直接用this操作当前对象。
在c语言中我们这样实现类似类的操作
static int _sa;
struct Test
{
int _a;
int _b;
};//相当于类中的私有成员
void Test_init(Test *const this, int a, int b)
{
this->_a = a;
this->_b = b;
}//类中的构造函数,在c语言还有一个形参就是this指针,由this调用结构体中的私有成员
void Test_show(Test *const this)
{
printf ("a = %d, b = %d, sa = %d\n", this->_a, this->_b, _sa);
}//类中普通的成员函数这里,是没有形参,但这里有this指针指向当前对象
static void Test_print()//类中的静态成员函数,在c语言中做全局函数,不需要this指针,所以在c++中可以直接用类调用
{
printf ("sa = %d\n", _sa);
}
Test t1
Test_init(&t1, 1, 2);//t1的地址传给this指针
Test t2
Test_init(&t2, 1, 2);//将t2d的指针地址传给this指针
Test_show(&t1);
Test_show(&t2);
在C++ 中的写法
#include <iostream>
using namespace std;
// 类的普通成员函数 都拥有一个隐藏的