当前位置: 首页 > wzjs >正文

政府门户网站的建设在内容上江阴网站优化公司

政府门户网站的建设在内容上,江阴网站优化公司,医院网站建设解决方案,专业app开发公司🦄个人主页:修修修也 🎏所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 什么是static? static的引入 静态数据的存储 全局(静态)存储区 static成员概念 static成员特性 ststic成员的应用 利用static实现一个可以计算程序中正在使用的类对象有…

🦄个人主页:修修修也

🎏所属专栏:C++

⚙️操作环境:Visual Studio 2022


目录

什么是static?

static的引入

静态数据的存储

全局(静态)存储区

static成员概念

static成员特性

ststic成员的应用

利用static实现一个可以计算程序中正在使用的类对象有多少的类

static成员妙解求1+2+3+...+n问题

结语


什么是static?

static的引入

static 是 C/C++ 中很常用的修饰符,它被用来控制变量的存储方式和可见性


静态数据的存储

全局(静态)存储区

        全局(静态)存储区内存区域中的划分,如下图所示:

        全局(静态)存储区:分为data段和bass段。data段(全局初始化区)存放初始化的全局变量和静态变量;bass段(全局未初始化区)存放未初始化的全局变量和静态变量。程序运行结束时自动释放。其中bass段在程序执行之前会被系统自动清0,所以未初始化的全局变量和静态变量在程序执行之前已经为0。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。

        在 C++ 中 static 的内部实现机制:静态数据成员要在程序一开始运行时就必须存在。因为函数在程序运行中被调用,所以静态数据成员不能在任何函数内分配空间和初始化。

        这样,它的空间分配有三个可能的地方,一是作为类的外部接口的头文件,那里有类声明;二是类定义的内部实现,那里有类的成员函数定义;三是应用程序的 main() 函数前的全局数据声明和定义处。

        静态数据成员要实际地分配空间,故不能在类的声明中定义(只能声明数据成员)。类声明只声明一个类的"尺寸和规格",并不进行实际的内存分配,所以在类声明中写成定义是错误的。它也不能在头文件中类声明的外部定义,因为那会造成在多个使用该类的源文件中,对其重复定义。

        static 被引入以告知编译器,将变量存储在程序的静态存储区而非栈上空间,静态数据成员按定义出现的先后顺序依次初始化,注意静态成员嵌套时,要保证所嵌套的成员已经初始化了。消除时的顺序是初始化的反顺序。

优势:

        可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。


static成员概念

        声明为static的类成员称为类的静态成员用static修饰的成员变量,称之为静态成员变量;用static修饰的成员函数,称之为静态成员函数静态成员变量一定要在类外进行初始化。


static成员特性

  1. 静态成员为所有类对象所共享,不属于某个具体的对象,存放在静态区。如下代码:
    class Student
    {
    public:Student(const char name[], int idea, int grade){strcpy(_name, name);_idea = idea;_grade = grade;}static int GetPostalCode(){return _postalCode;}
    private:char _name[10];int _idea;int _grade;static int _postalCode;
    };
    int Student::_postalCode = 710400;int main()
    {cout << Student::GetPostalCode() << endl;Student s1("张三", 1001, 3);Student s2("李四", 1002, 2);Student s3("王五", 1003, 1);return 0;
    }
    

    我们通过监控可以发现,在类里成员变量位置定义的静态成员变量并不存在于类对象中:也就是说,无论开辟了多少类对象,静态成员变量都只有一个,并且不属于任何类对象本身,只有成员变量才属于类对象。静态成员变量和类对象和其成员变量关系如下图:

  2. 静态成员变量必须在类外定义,定义时不添加static关键字,类中只是声明
  3. 类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问
  4. 静态成员函数没有隐藏的this指针不能访问任何非静态成员;但非静态成员可以访问静态成员函数
  5. 静态成员也是类的成员,受public、protected、private 访问限定符的限制

ststic成员的应用

利用static实现一个可以计算程序中正在使用的类对象有多少的类

        我们可以利用对象创建必调用构造,而销毁必调用析构函数的特性,在类里创建一个static类对象来记录类对象的创建数/销毁数。注意,由于全局变量的不安全性,我们并不推荐使用全局变量来完成这项任务,如下代码,定义了一个可以计算程序中有多少类对象还在生命周期的类:

#include<iostream>
using namespace std;class Count
{
public://构造函数,每构造一个对象,scount+1Count() { ++_scount; }//const构造函数,每构造一个对象,scount+1Count(const Count& t) { ++_scount; }//析构函数,每析构一个对象,scount-1~Count() { --_scount; }//获取scount的值static int GetSCount() { return _scount; }private://变量_scount的声明static int _scount;
};
//变量_scount的定义
int Count::_scount = 0;//创建全局Count对象a0
Count a0;int main()
{cout << __LINE__ << ":" << Count::GetSCount() << endl;Count a1, a2;{Count a3(a1);cout << __LINE__ << ":" << Count::GetSCount() << endl;}//出了域作用限定范围a3的生命周期结束就自动析构了cout << __LINE__ << ":" << Count::GetSCount() << endl;return 0;
}

        我们测试一下这段代码是否可以统计当前行有多少个类对象正在使用:

        综上,对于类对象的创建数/销毁数的记录工作,可以从下面三个方向入手:

  • 类对象的创建数=构造函数静态成员变量++
  • 类对象的销毁数=析构函数静态成员变量++
  • 类对象的在生命周期数=构造函数静态成员变量-析构函数静态成员变量

设计一个类,在类外面只能在栈/只能在堆上创建对象

        如下,我们平常创建类对象的时候,如果不加以限制,则类对象可能被创建在不同的内存区域:

class A
{
public:A(){}
private:int _a1 = 1;int _a2 = 2;
};int main()
{static A aa1;    //类对象在静态区A aa2;           //类对象在栈A* ptr = new A;  //类对象在堆return 0;
}

        但假如我们遇到了某种场景,即我们创建的这个类,只希望它在栈上创建对象/只希望它在堆上创建对象时,我们就可以通过将构造函数封装起来,再通过static修饰的类成员函数来创建指定的类对象,如:

class A
{
public:static A GetStackObj(){A aa;return aa;}static A* GetHeapObj(){return new A;}
private:A()//构造函数私有化{}
private:int _a1 = 1;int _a2 = 2;
};int main()
{//static A aa1;    //类对象在静态区//A aa2;           //类对象在栈//A* ptr = new A;  //类对象在堆A::GetStackObj();A::GetHeapObj();return 0;
}

        这里有几点需要解释一下:

        1.将构造函数封装起来是为了不让类外的函数随便不按要求构造类对象,如:

        2.使用成员函数来创建类对象是因为成员函数调用类函数不受访问限定符的限制,如:

        3.使用static修饰成员函数是因为要解决无类对象就无法调用类成员函数的问题,如:

        做个梗图给大家形象理解一下这里的矛盾逻辑:

        综上,巧用封装和static就可以达到一些特殊的我们想实现的效果,要灵活使用啊。


static成员妙解求1+2+3+...+n问题

 一.题目描述

牛客网题目链接:JZ64 求1+2+3+...+nicon-default.png?t=N7T8https://www.nowcoder.com/practice/7a0da8fc483247ff8800059e12d7caf1?tpId=13&tqId=11200&tPage=3&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
描述:

求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

数据范围: 0<n≤200
进阶: 空间复杂度 O(1) ,时间复杂度 O(n)

示例1:

输入:5

返回值:15

示例2:

输入:1

返回值:1

题目详情:


二.题目思路

  • 首先,我们创建一个Sum类,其中包含两个静态成员变量,一个是_i,一个是_ret
  • 其次,我们在主函数创建一个n个Sum类数据的数组,这意味着将要创建n个Sum类对象,则Sum的构造函数会被调用n次
  • 最后,我们在Sum的构造函数里让_ret+=_i后让_i++,这样,创建一个类对象_ret就会加等它的次序,即从1一直加到n。

三.解题代码

        根据上述思路,本题解题代码如下:

class Sum {
public:Sum(){_ret+=_i;_i++;}static int Getret(){return _ret;}private:static int _i;static int _ret;
};
int Sum::_i = 1;
int Sum::_ret = 0;class Solution {
public:int Sum_Solution(int n) {Sum a[n];//创建了n个对象,调用了n次构造函数return Sum::Getret();}
};

        拷贝到牛客网测试运行:

        成功通过:


结语

希望这篇关于 static关键字及其修饰的静态成员变量/函数详解 的博客能对大家有所帮助,欢迎大佬们留言或私信与我交流.

学海漫浩浩,我亦苦作舟!关注我,大家一起学习,一起进步!

相关文章推荐

【C++】构建第一个C++类:Date类

【C++】类的六大默认成员函数及其特性(万字详解)

【C++】内联函数

【C++】函数重载

【C++】什么是类与对象?

【C++】缺省参数(默认参数)

【C++】命名空间

【C++】“Hello World!“

http://www.dtcms.com/wzjs/199106.html

相关文章:

  • 东莞市住房建设部网站深圳市网络品牌推广
  • 门户网站域名是什么意思如何引流与推广
  • 易语言如何做验证系统官方网站竞价排名软件
  • 卡通网站建设东营百度推广公司
  • html教程资料seopeixun
  • 网站赞赏线上推广策划方案
  • 怎样进行公司网站建设在线推广企业网站的方法
  • apache wordpress 伪静态高中同步测控优化设计答案
  • 马云做的国外的网站叫什么名字刷推广软件
  • 建设项目环保竣工信息公开网站万词霸屏百度推广seo
  • django做网站好吗seo搜索引擎优化案例
  • 学校网站建设系统今日十大热点新闻
  • google如何提交网站新冠咳嗽怎么办
  • 武汉网站排名哪家公司好nba最新交易汇总实时更新
  • wordpress 形式php百度seo排名点击器
  • 技术好的手机网站建设近期国际新闻
  • 做商城网站数据库分类该有哪些百度域名注册
  • 长春建设厅网站首页长春网站开发公司
  • 网站建设的技术有哪些方面北京发生大事了
  • 印度喜欢用什么框架做外贸网站市场营销十大经典案例
  • 怎么自己制作游戏安阳企业网站优化外包
  • 网站建设的定义如何建立一个网站
  • 哈尔滨网站制作公司哪家好营销推广计划
  • 做网站换域名深圳百度
  • 建设书局 网站百度浏览器网址是多少
  • 营销网站建设前期准备广东培训seo
  • 网站建设费入什么科目搭建网站需要什么技术
  • 亚马逊中国官方网站成都营销推广公司
  • h5网站制作平台营销推广方案怎么写
  • 网站设计方面有什么公司网站优化包括哪些内容