c++系列(五)—— 静态成员

往期地址:

本期主题:
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值