- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章详解c++中的 static 关键字及作用由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
注:若没有特指是 静态成员时,默认都是普通成员; 。
类中的成员变量 和 成员函数 是分开存储的。其中, 。
1)每个对象都有独立的成员变量;成员变量可以存储在 栈空间、堆空间、全局数据区; 。
2)所有对象共享类的成员函数;成员函数 只能存储在 代码段; 。
类中的静态成员 。
1、用 static关键字 修饰; 。
2、可以用 类名::成员名 访问 静态成员; 。
3、静态成员 属于 整个类; 。
4、静态成员 是所属类的成员,其它类不能访问; 。
5、静态成员的内存分配 是 唯一的; 。
1) 静态成员变量 。
特征:1、静态成员变量 属于 整个类所有; 。
2、静态成员变量的生命周期不依赖任何对象;(静态成员变量的生命周期在程序的运行期) 。
3、所有对象共享类的静态成员变量; 。
4、可以通过 类名 直接访问公有的静态成员变量; 。
5、可以通过 对象名 访问公有的静态成员变量; 。
6、静态成员变量 需要在类外单独分配空间;(类内声明、类外定义并初始化) 。
7、静态成员变量 在程序内部位于全局数据区,不计入类的内存计算.
原因/好处:使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存.
使用方法:
1、在类的内部,使用 static 修饰普通成员变量; 。
2、在类的外部(全局作用域),使用 Type ClassName::VarName = value 初始化,并申请存储空间; 。
注:静态成员变量不属于类的任何对象,所以并不是对象建立时被定义的,所以它不能由类的构造函数初始化,一般也不能在类内初始化; 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
/*
静态成员变量 只能在类的内部声明,在类的外部(全局区)定义和初始化;
*/
#include <iostream>
using
namespace
std;
class
Test{
public
:
int
GetA()
const
{
return
a;}
private
:
static
int
a;
// 静态成员变量
};
//int Test::a;如果这样定义不赋予初值,则初值为零
int
Test::a = 1;
int
main(
int
argc,
char
*argv[])
{
Test T;
cout << T.GetA() << endl;
return
0;
}
|
静态成员变量 被类的所有对象共享,包括派生类对象; 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
#include <iostream>
using
namespace
std;
class
Base{
public
:
static
int
a;
// 静态成员变量
};
// int Test::a;如果这样定义不赋予初值,则初值为零
int
Base::a;
class
Derived :
public
Base{
};
int
main(
int
argc,
char
*argv[])
{
Base B;
Derived D;
B.a++;
cout << B.a << endl;
// 1
D.a++;
cout << D.a << endl;
// 2
return
0;
}
|
静态成员变量可以作为普通成员函数的默认形参,而普通成员变量则不可以; 。
1
2
3
4
5
6
7
|
class
Test{
public
:
static
int
a;
//静态成员变量
int
b;
void
fun_1(
int
i = a);
//正确
//void fun_2(int i = b); //报错
};
|
静态成员变量的类型 可以是所属类的类型,而普通成员变量则不可以。普通成员变量只能声明为 所属类类型的 指针或引用; 。
1
2
3
4
5
6
7
8
|
class
Test{
public
:
static
Test a;
//正确
Test b;
//报错
Test *pTest;
//正确
Test &m_Test;
//正确
static
Test *pStaticObject;
//正确
};
|
静态成员变量在const函数中可以修改,而普通的成员变量是万万不能修改的; 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
/*
const修饰的是当前this指针所指向的对象是const,但是静态成员变量不属于任何类的对象,它被类的所有对象修改,所以this指针不修饰静态的成员变量,所以可以更改。
*/
class
Test{
public
:
static
int
a;
int
b;
public
:
Test():b(0){}
void
test()
const
{
a++;
//b++; // err // const指的是不能修改当前调用该函数对象的成员变量
}
};
int
Test::a;
|
2)静态成员函数 。
特征:1、静态成员函数 属于 整个类所有; 。
2、所有对象共享类的静态成员函数; 。
2、可以通过 类名 直接访问公有的静态成员函数; 。
3、可以通过 对象名 访问公有的静态成员函数; 。
4、静态成员函数 只能 访问静态成员,不能访问 非静态成员; 。
5、静态成员函数没有this指针,也就是说静态成员函数不能使用修饰符(也就是函数后面的const关键字); 。
原因:处理静态成员变量; 。
使用方法:直接用 static 修饰 普通成员函数(类内声明时),不需要 static 修饰(类外定义时); 。
总结:
案例分析:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
/**
* 统计某班选修课考试的平均成绩
*/
#include <iostream>
#include <string>
using
namespace
std;
class
Student
{
private
:
string name;
// 姓名
string gender;
// 性别
float
score;
// 分数
string subject;
// 课程
static
int
total_counts;
// 总人数
static
float
chinese_scores;
// 语文分数
static
int
chinese_counts;
// 语文课人数
static
float
math_scores;
// 数学分数
static
int
math_counts;
// 数学课人数
public
:
Student(string name, string gender,
float
score, string subject);
~Student();
static
float
aveScores(string subject);
void
printStudentInfo();
void
printAveScores();
};
int
Student::total_counts = 0;
float
Student::chinese_scores = 0;
int
Student::chinese_counts = 0;
float
Student::math_scores = 0;
int
Student::math_counts = 0;
Student::Student(string name, string gender,
float
score, string subject)
{
this
->name = name;
this
->gender = gender;
this
->score = score;
this
->subject = subject;
if
(subject ==
"chinese"
|| subject ==
"语文"
)
{
chinese_scores += score;
chinese_counts++;
}
else
if
(subject ==
"math"
|| subject ==
"数学"
)
{
math_scores += score;
math_counts++;
}
else
{
cout <<
"this is no the subect:"
<< subject << endl;
}
total_counts += (chinese_counts + math_counts);
}
Student::~Student()
{
total_counts--;
chinese_counts--;
math_counts--;
}
float
Student::aveScores(string subject)
{
float
ave_score = 0;
if
(chinese_counts > 0 && subject ==
"chinese"
|| subject ==
"语文"
)
{
ave_score = (chinese_scores / chinese_counts);
//cout << subject << "\t" << chinese_counts << "\t" << chinese_scores << endl;
}
else
if
(math_counts > 0 && subject ==
"math"
|| subject ==
"数学"
)
{
ave_score = (math_scores / math_counts);
//cout << subject << "\t" <<math_counts << "\t" << math_scores << endl;
}
return
ave_score;
}
void
Student::printStudentInfo()
{
cout << name <<
"\t"
<< gender <<
"\t"
<< score <<
"\t"
<< subject << endl;
}
void
Student::printAveScores()
{
cout <<subject <<
" average score: "
<< aveScores(subject) << endl;
}
int
main(
int
argc,
char
const
*argv[])
{
const
int
SIZE = 5;
Student stu[SIZE] =
{
Student(
"10001"
,
"male"
, 92,
"语文"
),
Student(
"10002"
,
"male"
, 91,
"数学"
),
Student(
"10003"
,
"male"
, 91,
"数学"
),
Student(
"10004"
,
"male"
, 93,
"语文"
),
Student(
"10005"
,
"male"
, 92,
"语文"
),
};
for
(
int
i = 0; i < SIZE; i++)
{
stu[i].printStudentInfo();
}
stu[0].printAveScores();
stu[1].printAveScores();
cout <<
"语文"
<<
" average score: "
<< Student::aveScores(
"语文"
) << endl;
cout <<
"数学"
<<
" average score: "
<< Student::aveScores(
"数学"
) << endl;
return
0;
}
静态成员的案例分析
|
下面看下c语言中的static关键字的作用 。
在我们日常使用过程中,static通常有两个作用:
1、修饰变量 。
静态全局变量:全局变量前加static修饰,该变量就成为了静态全局变量。我们知道,全部变量在整个工程都可以被访问(一个文件中定义,其它文件使用的时候添加extern关键字声明 ),而在添加了static关键字之后,这个变量就只能在本文件内被访问了。因此,在这里,static的作用就是限定作用域.
静态局部变量:局不变量添加了static修饰之后,该变量就成为了静态局部变量。我们知道局部变量在离开了被定义的函数后,就会被销毁,而当使用static修饰之后,它的作用域就一直到整个程序结束。因此,在这里static的作用就是限定生命周期.
2、修饰函数 。
修饰函数则该函数成为静态函数,函数的作用域仅限于本文件,而不能被其它文件调用.
总结 。
以上所述是小编给大家介绍的c++中的 static 关键字及作用,希望对大家有所帮助! 。
原文链接:https://www.cnblogs.com/nbk-zyc/archive/2020/02/15/12305170.html 。
最后此篇关于详解c++中的 static 关键字及作用的文章就讲到这里了,如果你想了解更多关于详解c++中的 static 关键字及作用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
全称“Java Virtual Machine statistics monitoring tool”(statistics 统计;monitoring 监控;tool 工具) 用于监控虚拟机的各种运
主要是讲下Mongodb的索引的查看、创建、删除、类型说明,还有就是Explain执行计划的解释说明。 可以转载,但请注明出处。  
1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发。 2>循环服务器和并发服务器
详解 linux中的关机和重启命令 一 shutdown命令 shutdown [选项] 时间 选项: ?
首先,将json串转为一个JObject对象: ? 1
matplotlib官网 matplotlib库默认英文字体 添加黑体(‘SimHei')为绘图字体 代码: plt.rcParams['font.sans-serif']=['SimHei'
在并发编程中,synchronized关键字是常出现的角色。之前我们都称呼synchronized关键字为重量锁,但是在jdk1.6中对synchronized进行了优化,引入了偏向锁、轻量锁。本篇
一般我们的项目中会使用1到2个数据库连接配置,同程艺龙的数据库连接配置被收拢到统一的配置中心,由DBA统一配置和维护,业务方通过某个字符串配置拿到的是Connection对象。  
实例如下: ? 1
1. MemoryCahe NetCore中的缓存和System.Runtime.Caching很相似,但是在功能上做了增强,缓存的key支持object类型;提供了泛型支持;可以读缓存和单个缓存
argument是javascript中函数的一个特殊参数,例如下文,利用argument访问函数参数,判断函数是否执行 复制代码 代码如下: <script
一不小心装了一个Redis服务,开了一个全网的默认端口,一开始以为这台服务器没有公网ip,结果发现之后悔之莫及啊 某天发现cpu load高的出奇,发现一个minerd进程 占了大量cpu,googl
今天写这个是为了 提醒自己 编程过程 不仅要有逻辑 思想 还有要规范 代码 这样可读性 1、PHP 编程规范与编码习惯最主要的有以下几点: 1 文件说明 2 funct
摘要:虚拟机安装时一般都采用最小化安装,默认没有lspci工具。一台测试虚拟网卡性能的虚拟机,需要lspci工具来查看网卡的类型。本文描述了在一个虚拟机中安装lspci工具的具体步骤。 由于要测试
1、修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统
目录 算术运算符 基本四则运算符 增量赋值运算符 自增/自减运算符 关系运算符 逻
如下所示: ? 1
MapperScannerConfigurer之sqlSessionFactory注入方式讲解 首先,Mybatis中的有一段配置非常方便,省去我们去写DaoImpl(Dao层实现类)的时间,这个
Linux的网络虚拟化是LXC项目中的一个子项目,LXC包括文件系统虚拟化,进程空间虚拟化,用户虚拟化,网络虚拟化,等等,这里使用LXC的网络虚拟化来模拟多个网络环境。 本文从基本的网络设备讲
? 1
我是一名优秀的程序员,十分优秀!