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

建设外国商城网站城市宣传片制作公司

建设外国商城网站,城市宣传片制作公司,建平县营商环境建设局网站,织梦能不能做门户网站目录 1.static成员变量 问题:实现一个类,计算程序中创建出了多少个类对象 设计思路 代码示例 版本1 版本2 static成员 特点1.static成员为静态成员,为所有类对象所共享(在某种程度上可以理解为全局的,用类去封装"全局变量"),存放在静态区,则不属于某个具体的…

目录

1.static成员变量

问题:实现一个类,计算程序中创建出了多少个类对象

设计思路

代码示例

版本1

版本2

static成员

特点1.static成员为静态成员,为所有类对象所共享(在某种程度上可以理解为全局的,用类去封装"全局变量"),存放在静态区,则不属于某个具体的对象,不能通过初始化列表来初始化

特点2.静态成员变量必须在类外初始化,定义时不添加static关键字,类中只是声明

特点3:类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问 

练习:求下面代码的打印结果

分析

特点4:静态对象只会定义一次

特点5:静态成员也是类的成员,受public、protected、private 访问限定符的限制

2.static成员函数

特点6:静态成员函数没有this指针,只要指定类域且静态成员变量在public里面就可以访问

3.静态成员函数的理解误区


1.static成员变量

问题:实现一个类,计算程序中创建出了多少个类对象

设计思路

使用一个成员变量count实时记录创建出了多少个类对象

调用构造函数:对象个数+1

调用析构函数:对象个数-1

如果某个函数需要使用自定义类型的拷贝,调用拷贝构造函数,对象个数+1

显示一共创建出了多少个对象:GetCount()成员函数返回count的值

代码示例

版本1
class Myclass
{
public:Myclass() {count++; }Myclass(const Myclass&){count++;}~Myclass() {count--; }int GetCount() {return count; }private:int count=0;
};

但这样做会有问题: count是普通的成员变量,和其对应的对象绑定的,则count的结果只能是0或者1,即创建多少个对象就有多少个count,违背了题目的意思,题目的意思是用一个count来统计创建了多少个类对象

 不建议使用全局变量,因为任何地方都可以随意改变,而且某些情况下会出错,例如:

Myclass function(const Myclass myobj)
{static Myclass myobj;count++;
}

多次调用function函数,myobj是静态对象,只会初始化一次,但是每调用一次function函数,count都会++,导致错误的结果

这里要引入static成员,封装能完美解决问题

版本2
static成员

特点1.static成员为静态成员,所有类对象所共享(在某种程度上可以理解为全局的,去封装"全局变量"),存放在静态区,则不属于某个具体的对象,不能通过初始化列表来初始化

特点2.静态成员变量必须在类外初始化,定义时不添加static关键字,类中只是声明

像下面这样写就是错误的:

(静态成员变量无初始化列表,不能加缺省值)

 (静态成员变量无初始化列表)

正确写法:

在类外定义(也仅仅是定义)可以摆脱私有的限制

注:静态成员变量在定义可以摆脱私有,但访问上不能摆脱私有

特点3:类静态成员即可用 类名::静态成员 或者 对象.静态成员 来访问 

正确代码:

class Myclass
{
public:Myclass() {count++; }Myclass(const Myclass&){count++;}~Myclass() {count--; }static int GetCount()//静态成员函数{return count; }
private:static int count;
};
int Myclass::count = 0;

测试以下代码:

int main()
{Myclass myobj1;cout << myobj1.GetCount() << endl;//对象.静态成员Myclass myobj2;cout << myobj2.GetCount() << endl;return 0;
}

或者也可以这样写:

int main()
{Myclass myobj1;cout << Myclass::GetCount() << endl;//类名::静态成员Myclass myobj2;cout << Myclass::GetCount() << endl;return 0;
}

count在正常变动:

练习:求下面代码的打印结果

Myclass function(const Myclass myobj)
{cout << Myclass::GetCount() << endl;return myobj;
}Myclass global_obj;
int main()
{cout << Myclass::GetCount() << endl;{static Myclass myobj0;Myclass myobj1;cout << Myclass::GetCount() << endl;}cout << Myclass::GetCount() << endl;Myclass myobj2;cout << Myclass::GetCount() << endl;function(myobj2);cout << Myclass::GetCount() << endl;return 0;
}
分析

第一次打印:创建了全局对象global_obj,打印结果为1(说明static对象myobj0不会在全局对象前初始化)

第二次打印:创建了静态对象myobj0和局部对象myobj1(),打印结果为3,

第三次打印:myobj1被销毁,myobj0和global_obj都存储在静态区,不受{ }管控,因此打印结果为2

第四次打印:创建了myobj2对象,打印结果为3

第五次打印:调用function(myobj2),由于function接收的参数为const Myclass myobj,需要调用拷贝构造函数,对象+1,count==4,打印结果为4

由于function返回的是对象,因此会再次调用拷贝构造函数创建临时对象,count会短暂变为5

函数结束时,程序会调用两次析构函数,function产生的临时对象和myobj都被销毁,count变回3

第六次打印:打印结果为3

特点4:静态对象只会定义一次

例如以下代码:

Myclass function()
{static Myclass myobj;return myobj;
}int main()
{function();cout << Myclass::GetCount() << endl;function();cout << Myclass::GetCount() << endl;return 0;
}

分析:虽然调用两次function函数,但是myobj只会初始化一次,因此打印结果都是1

特点5:静态成员也是类的成员,受public、protected、private 访问限定符的限制

2.static成员函数

上方代码的Myclass类中有这样一个函数:

static int GetCount()//返回静态类型
{return count; 
}

和普通函数不一样的是:GetCount函数的返回类型是static int,则称GetCount是静态成员函数

特点6:静态成员函数没有this指针,只要指定类域且静态成员变量在public里面就可以访问

一般情况下, 静态成员函数和静态成员变量配套出现,例如GetCount()和count静态成员变量

注意:没有this指针就要注意对象的成员变量是不可访问的!

例如以下错误代码:

class Myclass
{
public:static int GetCount(){static int ret=val1;return ret;}
private:int val1=1;
};

错因:静态成员函数中使用非静态成员变量val1,非静态成员变量需要通过对象实例来访问,但静态成员函数没有this指针,因此无法访问到val1

3.静态成员函数的理解误区

之前在CD19.【C++ Dev】类和对象(10) 日期类对象的成员函数(日期+天数)文章中写符取得月份天数的函数

class Date
{
public:static int GetMonthDay(int year, int month);//省略其他成员函数
private:int _year;int _month;int _day;
};

可以改成静态成员函数,如下:

//int前不要加static!
int Date::GetMonthDay(int year,int month)
{static int day[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//默认2月是28天,之后单独判断if (month == 2 && ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))){return 29;}return day[month];
}

注意:在写GetMonthDay函数的定义时,返回类型不要写成static int!!!类的声明中加了static只是表明是类的一个静态成员函数,和返回值没有任何关系 

可以通过如下两种方式调用该函数:

方式1:类名::

#include "Date.h"
int main()
{cout << Date::GetMonthDay(2025, 4) << endl;//类名::GetMonthDay(2025, 4)return 0;
}

运行结果:

方式2:对象.

#include "Date.h"
int main()
{Date d;cout << d.GetMonthDay(2025, 4) << endl;//对象.GetMonthDay(2025, 4)return 0;
}

运行结果:

http://www.dtcms.com/a/568332.html

相关文章:

  • 云南省红河州蒙自建设局网站暴雪回归
  • 走出趣网站怎么做淮安经济技术开发区建设局网站
  • joomla! 1.5 网站建设基础教程网络营销公司注册找哪家
  • 网站后期维护管理黑龙江建设网查询平台
  • phpmysql网站开发实例重庆卓光科技有限公司
  • 更改网站模板内容网址在线生成短链接
  • 南昌金启网站建设郴州网站建设设计
  • 四川建设厅下载专区网站北京市企业网站建设
  • 网站右侧出现百度名片叫什么wordpress的页面和首页一样
  • 租车网站建设系统的设计知乎关键词搜索排名
  • 网络营销企业网站推广网店运营包括哪些
  • 网站后台怎么换图片建设专业网站哪家更专业
  • 开发网站广州wordpress如何导入
  • 网站建设制作要学什么中关村在线电脑网
  • 做一个介绍网站多少钱赣州金图网络科技有限公司
  • 网站管理建设落实报告烟台网站关键词推广
  • 上海建筑 公司网站怎么把网站的标题做的炫酷
  • 爱彩人网站怎么做一天能免费看3次的app
  • 网站改版 英文成都建设网站分享
  • 建立网站费用wordpress二开前端
  • 免费的小程序制作工具佛山网站优化流程
  • 紫色网站建设网站用什么语言开发稳定
  • 自己做的网站网站搜索公众号平台登录入口官网
  • 连云港做网站企业wordpress在线点播
  • 做俄罗斯生意网站网页制作基础教程胡崧免费下载
  • 广州我要做网站扬州网站建设
  • 图书馆网站建设情况汇报有哪些网站可以免费发布广告
  • 佛山网站建设与设计公司ui设计需要学编程吗
  • 建设银行证券转银行网站哈尔滨网站建设工作
  • 绵阳网站建设怎么选广州 网站制作