0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于C++类的static详细介绍

NJ90_gh_bee81f8 2018-02-23 08:30 次阅读

对于某些特定类类型的全体对象而言,访问一个全局对象有时是有必要的。在程序运行的任意点可能需要统计已创建的特定类类型对象的数量,但是全局对象会破坏封装,并且没有安全保护,一般的用户代码就可以修改这个值。

类可以定义static成员,用于解决同一个类的不同对象之间数据和函数共享的问题,用一个类的不同对象的的静态成员使用同一个内存空间。静态成员包含静态数据成员和静态函数成员。

通常,非static数据成员存在于类类型的每个对象中,但是static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不是与该类的对象关联。

静态成员函数没有this形参,可以直接访问所属类的static成员,但是不能直接使用非static成员。

使用静态成员的优点:

(1)有利于类的封装,可以把static成员定义为私有成员,防止外部访问;

(2)static成员是与特定的类关联的,在外部必须使用类名字做前缀,程序更加清晰;

(3)static成员的名字是在类的作用域中,可以避免命名冲突。

(一)定义static成员

static遵循正常的公有、私有访问限制。每一个要定义为static的成员前面都需要有static,这和访问限制不同。

static成员函数可以直接定义在声明的后面,也可以在类的外面定义。当在类外面定义时,不需要static关键字。

在静态成员函数中,不可以使用this指针,因为静态成员函数是同一个类所有对象共有的。同样静态成员函数中也不可以使用非静态的数据成员,只可以使用类的静态数据成员。

class Student

{

public:

static int getCount();

static int count;

};

和普通的数据成员不同,static数据成员必须在类定义体的外部定义并初始化,定义的时候必须要有类名所前缀。

int Student::count=0;

(二)使用static成员

可以使用作用域运算符“::”从类直间调用static成员,或者通过对象、引用该类类型对象的指针间接调用。如可以使用下面的方法访问静态成员。

Student::count=0;

int n=Student::getCount();

也可以通过类对象对静态成员进行访问:

Student stu1;

stu1.count=0;

Student *s=&syu1;

int n=s->getCount();

当在类的内部使用静态成员时,可以直接使用,不需要作用域运算符。此外可以使用非static成员的方法来使用static成员。

2.1使用静态数据成员

#include

using namespace std;

class Test

{

public:

static int n;

Test(int x)

{

k = x;

n++;

}

void disp()

{

cout << "n= " << n << ", k=" << k << endl;

}

private:

int k;

};

int Test::n = 0;

int main()

{

Test t1(10);

t1.disp();

Test t2(20);

t2.disp();

Test::n++;

t2.disp();

system("pause");

return 0;

}

基于C++类的static详细介绍

2.2 使用静态成员函数

静态成员函数可以直接引用该类的静态数据成员和成员函数,但不能引用非静态成员。如果要引用非静态成员,必须通过参数传递的方式得到对象名,再通过对象名来引用。使用静态成员函数要注意的问题:

静态成员函数可以在类内定义,也可以在类外定义,在类外定义时不用再加关键字static;

系统限定静态成员函数为内部连接,这样就不会因为与连接文件中的其他同名成员函数相冲突,保证了静态成员函数的安全性;

静态成员函数中没有隐含this指针;

#include

using namespace std;

class Dot

{

static int t;

int a, b;

public:

Dot(int x = 0, int y = 0)

{

a = x;

b = y;

t++;

}

Dot(Dot &d);

int geta()

{

return a;

}

int getb()

{

return b;

}

static void gett()

{

cout << "object id:" << t << endl;

}

};

Dot::Dot(Dot &d)

{

a = d.a;

b = d.b;

t++;

}

int Dot::t = 0;

int main()

{

Dot::gett();

Dot d1(2, 3);

cout << "Dot d1:" << d1.geta() << "," << d1.getb() << endl;

d1.gett();

Dot d2(d1);

cout << "Dot d2:" << d2.geta() << ", " << d2.getb() << endl;

Dot::gett();

system("pause");

return 0;

}

基于C++类的static详细介绍

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C++
    C++
    +关注

    关注

    22

    文章

    2105

    浏览量

    73513
  • static
    +关注

    关注

    0

    文章

    33

    浏览量

    10356

原文标题:C++类的static成员

文章出处:【微信号:gh_bee81f890fc1,微信公众号:面包板社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C++中的结构和

    C++ 有结构,就像 C 一样,因为它们是不一样的。C++,它们与结构非常相似。本文解开这些语言元素的细节。
    发表于 07-18 17:37 794次阅读

    C++课程资料详细资料合集包括了:面向对象程序设计与C++,算法,函数等

    本文档的主要内容详细介绍的是C++课程资料资料合集包括了:面向对象程序设计与C++,算法,函数,概述, C++语言基础,构造数据类型,数据类
    发表于 07-09 08:00 18次下载
    <b class='flag-5'>C++</b>课程资料<b class='flag-5'>详细</b>资料合集包括了:面向对象程序设计与<b class='flag-5'>C++</b>,算法,函数等

    基于fpgrowth的c++实现详细资料免费下载

    本文档的主要内容详细介绍的是基于fpgrowth的c++实现详细资料免费下载
    发表于 08-02 08:00 1次下载

    VISUAL C++教程之VISUAL C++的安装和使用方法

    本文档的主要内容详细介绍的是VISUAL C++教程之VISUAL C++的安装和使用方法资料免费下载。
    发表于 12-27 16:32 19次下载
    VISUAL <b class='flag-5'>C++</b>教程之VISUAL <b class='flag-5'>C++</b>的安装和使用方法

    C++的cast最完整最详细的解释资料说明

    本文档的主要内容详细介绍的是C++的cast最完整最详细的解释资料说明。
    发表于 01-29 15:26 0次下载
    <b class='flag-5'>C++</b>的cast最完整最<b class='flag-5'>详细</b>的解释资料说明

    C++教程之数据线性结构的详细资料介绍

    本文档的主要内容详细介绍的是C++教程之数据线性结构的详细资料介绍
    发表于 02-14 16:18 1次下载
    <b class='flag-5'>C++</b>教程之数据线性结构的<b class='flag-5'>详细</b>资料<b class='flag-5'>介绍</b>

    Visual C++教程之C++的基础知识介绍

    本文档的主要内容详细介绍的是Visual C++教程之C++的基础知识介绍主要内容包括了:1
    发表于 02-15 15:59 9次下载
    Visual <b class='flag-5'>C++</b>教程之<b class='flag-5'>C++</b>的基础知识<b class='flag-5'>介绍</b>

    C++程序设计教程之类的详细资料说明

    本文档的详细介绍的是C++程序设计教程之类的详细资料说明主要内容包括了:1. 从结构到( From Structure to Class
    发表于 02-22 09:44 2次下载
    <b class='flag-5'>C++</b>程序设计教程之类的<b class='flag-5'>详细</b>资料说明

    C++程序设计教程之C++工具的详细资料说明

    本文档的详细介绍的是C++程序设计教程之C++工具的详细资料说明主要内容包括了:1. 异常处理,2. 命名空间,3. 使用早期的函数库
    发表于 03-14 16:39 4次下载
    <b class='flag-5'>C++</b>程序设计教程之<b class='flag-5'>C++</b>工具的<b class='flag-5'>详细</b>资料说明

    C++串口程序第三方代码免费下载

    本文档的主要内容详细介绍的是C++串口程序第三方代码免费下载。
    发表于 09-11 08:00 7次下载
    <b class='flag-5'>C++</b>串口程序第三方<b class='flag-5'>类</b>代码免费下载

    C++语言编码规范详细说明

    本文档的主要内容详细介绍的是C++语言编码规范详细说明。
    发表于 01-07 16:19 14次下载
    <b class='flag-5'>C++</b>语言编码规范<b class='flag-5'>详细</b>说明

    C语言和C++的特点与用法详细说明

    本文档的主要内容详细介绍的是C语言和C++的特点与用法详细说明。
    的头像 发表于 12-26 10:58 4372次阅读

    Visual C++介绍和数据类型详细说明

    Visual C++介绍和数据类型详细说明介绍
    发表于 03-29 15:32 17次下载

    EE-128:C++中的DSP:从C++调用汇编成员函数

    EE-128:C++中的DSP:从C++调用汇编成员函数
    发表于 04-16 17:04 2次下载
    EE-128:<b class='flag-5'>C++</b>中的DSP:从<b class='flag-5'>C++</b>调用汇编<b class='flag-5'>类</b>成员函数

    C++的输入流和输出流介绍

    C++的输入流和输出流是C++标准库中的两个重要的流,分别用于输入和输出数据。在本篇博客中,我们将详细介绍
    的头像 发表于 04-30 17:58 2030次阅读