往期地址:
本期主题:
c++中的静态类和静态成员
文章目录
1.静态成员
定义:
- 用static 关键字来定义静态成员变量
1.1 与普通成员一样用对象访问
class person
{
public:
int age;
static int height; //静态成员变量,在这里只是声明,相当于定义了一个模板,但是没有去实例化
};
int person::height; //这一句不可少,这一句是在定义height这个静态变量,假如没有这一句会报错,见下面的报错信息
int main(void)
{
person p1;
p1.height = 1; //通过对象来访问
return 0;
}
//TODO:为什么是链接时报错?
//报错信息:链接时报错
person.cpp:(.text+0xf): undefined reference to `person::height'
/tmp/ccEZ8n6L.o: In function `main':
collect2: error: ld returned 1 exit status
Makefile:2: recipe for target 'all' failed
make: *** [all] Error 1
1.2 直接用类来访问
int person::height; //这一句不可少,这一句是在定义height这个静态变量
int main(void)
{
person::height = 1; //直接通过类来访问
return 0;
}
1.3 静态成员属于类本身,而不属于对象
结论:如果是同一个类的多个对象,他们的静态成员是共享
的
代码验证:
int main(void)
{
person p1;
person p2;
person::height = 10; //直接用类访问
p1.print();
p1.height = 1; //用对象p1来访问
p1.print();
p2.height = 2; //用对象p2来访问
p1.print();
return 0;
}
gary@ubuntu:~/workspaces/cpp_study/3.1.static$ ./app
height is 10
height is 1
height is 2
1.4 总结静态成员访问方式
- 静态数据成员
不能在类中初始化
,因为类定义实际只是模型,本身并没有和变量/对象实体去关联; - 静态成员变量在类的多个对象中均可访问,且是同一个实体,被多个对象
共享
; - 静态成员变量可以用
对象
来调用,也可以直接用类本身
来调用;
2.静态成员方法的调用
当类需要去调用静态成员方法时,有两种途径:
- 直接对象去调用,和普通的成员方法一样;
- 利用类名::func()方式去调用;
直接访问以及类名::func()方式
2.1 直接访问
class person
{
public:
int age;
static int height;
void print(void);
static void test(void);
};
int main(void)
{
person p1;
p1.test(); //利用对象调用
//person::test();
return 0;
}
2.2 类名::func()方式
int main(void)
{
person p1;
// p1.test(); //利用对象调用
person::test(); //类名::func()方式来访问
return 0;
}
3.普通成员函数中调用静态成员和方法
普通成员函数中,调用静态成员和方法有三种方式:
- 直接访问
- 通过this指针访问
- 类名::func方式访问
class person
{
public:
int age;
static int height;
void print(void);
static void test(void);
};
void person::print(void)
{
cout << "1.height is " << this->height << endl; //1.通过this指针来访问非静态成员变量
cout << "2.height is " << height << endl; //2.通过直接访问非静态成员变量
cout << "3.height is " << person::height << endl; //3.通过类来访问
}
gary@ubuntu:~/workspaces/cpp_study/3.1.static$ ./app
1.height is 10
2.height is 10
3.height is 10