- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章c++中的static修饰符示例详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
本文主要给大家介绍了关于c++中static修饰符的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧.
下面一段是引用自effective c++ 中的一句话:
所谓的static对象,其寿命是从构造出来到程序结束为止(以下文章不再赘诉)。因此stack和heap-base对象都被排除。这种对象包括global对象,定义于namespace作用域内的对象,在classes内,在函数内,以及在file作用域内被声明为static的对象.
所以static在c++中可以存在在一下几种情况
1.存在于全局作用域中的静态变量 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//全局可访问,在内存中只有一份拷贝,可被很多函数修改。
#include <iostream>
static
int
i = 1;
//作用域是整个file
void
get(){
std::cout <<
"in func , the i is "
<< i << std::endl;
}
int
main(){
std::cout <<
"the i is "
<< i << std::endl;
get();
return
0;
}
|
2.存在于函数当中的静态变量 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// 只能在这个函数中才能被调用。
// 函数调用结束后,一般局部变量都被回收了,静态变量还存在
#include <iostream>
void
get(){
static
int
i = 1;
std::cout <<
"the i is "
<< i << std::endl;
i++;
}
int
main(){
get();
// i = 1
get();
// i = 2
std::cout <<
"the i is "
<< i << std::endl;
// 这种是错误的
return
0;
}
|
3.存在于类的成员变量中的静态变量 。
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
|
//其实原理跟函数中的静态变量类似,类实例化出来的对象被销毁后,
// 但是类变量(静态成员变量)还是存在在内存中的
#include <iostream>
class
Widget{
public
:
Widget(
int
i){
a = i;
}
void
get();
private
:
static
int
a;
// 声明静态变量
};
int
Widget::a = 1;
// 由于是类变量不是属于专属于一个对象的,被所有对象共享
// 所以需要在类外定义
void
Widget::get(){
std::cout <<
"the a is "
<< a++ << std::endl;
}
int
main(){
Widget w(1);
w.get();
// a = 1
w.get();
// a = 2
return
0;
}
|
4.存在于类中成员函数中的静态变量 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include <iostream>
class
widget{
public
:
widget(){}
void
get();
};
void
widget::get(){
static
int
i = 1;
//成员函数中的静态变量的作用域范围跟普通局部变量的作用域范围是一样的
std::cout <<
"in func, the i is "
<< i++ << std::endl;
}
int
main(
int
argc,
char
const
* argv[])
{
widget w1;
w1.get();
// in func, the i is 1
widget w2;
w2.get();
// in func, the i is 2
return
0;
}
|
5.存在于命令空间中的静态变量 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <iostream>
namespace
Widget {
static
int
i = 1;
// 在该命名空间可用
void
get(){
std::cout <<
"the i is "
<< i++ << std::endl;
}
}
// namespace Widget
int
main (){
using
namespace
Widget;
get();
//the i is 1
get();
// the i is 2
return
0;
}
|
6.存在于全局作用域的静态函数 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// 其实跟一般的函数差不多,
// 但是它将该函数的链接属性限制为内链接,
//只能在本编译单元中使用(也就是本文件),
//不能被extern等在外部文件中引用
static
void
get(){
std::cout <<
"this is staic global func"
<< std::endl;
}
int
main(){
get();
get();
return
0;
}
|
7.存在于类中的静态函数 。
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
|
#include <iostream>
class
Widget{
public
:
Widget(
int
i){
a = i;
}
static
void
get();
// 声明静态函数
private
:
static
int
a;
int
b;
};
int
Widget::a = 1;
void
Widget::get(){
std::cout << b << std::endl;
//这是错误的,因为静态函数和静态变量直接能够
// Widget::get()调用,不需要实例化,所以不能
// 调用只能实例化才能初始化的成员变量。
std::cout << a << std::endl;
//ok
}
int
main(){
Widget w(1);
w.get();
return
0;
}
|
总结:
不管是什么静态变量,它的lifetime是从他被构造出来到程序结束为止.
static类型的变量跟其他普通的变量的不同在于在内存中的存在形式不同,例如存在于函数中的局部变量,每当调用一次函数,就会产生一个局部变量,而存在于函数中的静态变量只在该函数第一次被调用时被初始化,然后,然后在内存只保有一份拷贝 。
补充 。
链接属性分为三种:
1. 内链接 。
2. 外链接 。
内链接:
static修饰的函数和变量 和 const 修饰的变量(不包含extern)都是内链接,只能在本文件中使用,即使别的文件定义了相同的变量名也不要紧.
外链接:
没有用static修饰的全局变量或者函数,都是可以作为外链接用extern修饰的全局变量或者函数,也是作为外部链接。还有一个 extern const int i = 1;这也是外部链接,因为extern的作用会覆盖掉const使它成为外链接.
还有一类:局部变量,它的lifetime只是在函数执行期间,所以是没有链接属性的.
常成员函数是不能修改类中成员变量的,但是静态成员变量是类变量,所以可以修改 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <iostream>
class
Widget{
public
:
Widget(
int
i){
b = i;
}
void
set()
const
;
private
:
static
int
a;
int
b;
};
int
Widget::a = 1;
void
Widget::set()
const
{
a++;
//这是对的,因为是静态成员变量是类变量
b++;
//错误的,普通成员变量是不能被常函数改变的。
}
|
总结 。
以上就是这篇文章的全部内容了,本文还有许多不足,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我的支持.
原文链接:https://segmentfault.com/a/1190000011608100 。
最后此篇关于c++中的static修饰符示例详解的文章就讲到这里了,如果你想了解更多关于c++中的static修饰符示例详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是 F# 的菜鸟,目前正在阅读 F# 3.0 中的专家。 它是我学习的第一种编译语言(我只知道用 R 编程) 在第 6 章第 117 页,我们没有太多仪式性地介绍 静态让和静态成员。我真的不明白它是
我很迷茫。我已经花几个小时广泛地复习了我的两个类(class)。没有什么是静态的,没有什么是静态引用的,但我无法摆脱这个错误。 A 类文件 (ClassA.php) privateVariable =
关于类公共(public)类声明,请看这两段代码: public class Helper { public static void CallMeganFox(string phoneNumb
我如何使用“super”关键字从父类(super class)(类“aa”)引用“a1” class aa { protected static int a1 = 2; } public class
class Perkusja { boolean talerze = true; boolean beben = true; void zagrajNaBebnie() { Sys
我试图在编译 C++ 程序时静态链接库。 g++ (GCC) 4.8.5 20150623(红帽 4.8.5-4) $ g++ -std=c++11 -I/home/jerry/Desktop/tin
$ javac TestFilter.java TestFilter.java:19: non-static variable this cannot be referenced from a sta
这个问题在这里已经有了答案: How do I create a global, mutable singleton? (7 个答案) How can you make a safe static
“覆盖”静态数组时我遇到了一个棘手的问题。我有静态数组(为简单起见),它们在不同的派生类中具有固定长度,但在编译时仍然知道所有大小。我在基类中也有一个虚函数,但我不知道如何解决在派生类中覆盖这些数组和
我刚刚在遗留代码中发现了这一点。我知道使用宏,每当使用名称时,它都会被宏的内容替换。它们最常用于为数字常量提供符号名称。我所知道的是预处理没有类型安全、范围的概念。 这样做的真正好处是什么? #def
将 Singleton 实例声明为 static 还是声明为 static final 更好? 请看下面的例子: 静态版本 public class Singleton { private s
问题: 我观察到的行为是 TypeScript 的预期行为吗? 我观察到的行为是 ECMAScript 6 的预期行为吗? 是否有一种简单的方法可以返回继承层次结构以处理每个级别的“myStatic”
在php中,访问类的方法/变量有两种方法: 1. 创建对象$object = new Class(),然后使用”->”调用:$object->attribute/functi
我尝试向 ExpandoObject 添加一个动态方法,该方法会返回属性(动态添加)给它,但它总是给我错误。 我在这里做错了吗? using System; using System.Collecti
我试图获得一个静态链接到我的程序的音频库。我用 this灵活的包。为了让它运行,我必须按照描述构建 soloud 库 here .下载后不久,我在“build”文件夹中运行了“genie --with
这是我的webpack.prod.config.js代码 const path = require('path'); const { CleanWebpackPlugin } = require('c
我想知道什么时候应该对变量和(或)方法使用静态、最终、静态最终参数。据我了解: final:类似于c++中的const参数。它基本上意味着值(或在方法中 - 返回值)不会改变。 静态:这意味着值(或方
我一直在阅读有关使用静态对象作为锁的内容,最常见的示例如下: public class MyClass1 { private static final Object lock = new Obje
在 Visual Basic 2008 中,我知道有两种不同的方法可以完成同一件事: 成员(member)级别的 Dim: Dim counter1 as integer = 0 Dim counte
static public final int i = 0; public static final int i = 0; 两者都工作正常。 为什么同样的事情可以用两种不同的风格来完成? 最佳答案 因
我是一名优秀的程序员,十分优秀!