static在c\c++中的作用(翁恺c++公开课[28-29]学习笔记)
static相对来说是一个较复杂的修饰符,c++中的static在c的基础之上又包含了static在类中的应用(也就是说多了static的成员变量和static的成员函数);c\c++中静态变量、对象的初始化是在mian函数运行之前被初始化的,而且是没有顺序的,如果多个静态变量、对象有依赖顺序,最好定义在同一个文件中,或者直接不要这么做。
c中:
static主要定义全局、局部静态变量以及定义静态函数;全局静态变量和全局局部变量其实是一样的,可以统称为静态变量,注意:局部变量在第一次进这个函数时会被初始化之后不会再被初始化。
- 全局静态变量:在全局区分配内存,没有初始化其默认值为0,只会初始化一次、该变量只在本文件内从定义开始到文件结束可见。
- 全局静态函数:在全局区分配内存、该函数只在本文件内从定义开始到文件结束可见。
c中staic就被赋予了两种不同的职责,在c语言中static的临时变量(在函数内声明的变量)就是全局变量,static声明的变量、函数不能在其它文件中访问,只能在当前文件内使用。
c++中:
静态成员函数、成员变量的设计初衷,就是要做一种成员变量和函数,使其与类的某一个对象无关(也就是说可以在此类所有的对象之间共享),接下来我们进行详细的使用场景说明。
静态对象:在mian函数运行之前被初始化,在程序结束之前被析构,其余和c的全局变量一致。
在c++中控制变量和函数的可见性有了更好的解决方案:成员变量、成员函数及类的访问控制符(private public protected)
静态成员变量:如果类中声明一个静态的成员变量,那么这个静态成员变量在所有这个类的对象中的值是保持一致的;那他是怎么实现的呢,其实很简单,请看 “int A::i =20;”这行代码,他其实就是声明了一个叫“A::i”的全局变量来实现的,这里的“A::i”和C语言中的声明全局变量“static int i=20;”中的i是代表一个东西,都是变量的一种形式,只不过c++中的static写到了类里边。
#include <iostream>
using namespace std;
class A
{
public:
//A():i(0) { } //初始化列表不能初始化静态成员变量
A() { i = ; }
void print() { cout << i << endl; }
void set(int ii) { i=ii; }
private:
static int i;
};
int A::i = ; //类内只是声明,没有定义,如果要使用必须要在类外的cpp文件进行定义;还就是这是这段代码首先被执行的命令行,再到main,再到A的构造函数
int main()
{
A a,b;
a.set();
b.print();
return ;
}

initialized构造函数初始化列表只能对非静态成员变量做初始化,我们改一下构造函数的初始化方式,编译器就会报错!
#include <iostream>
using namespace std;
class A
{
public:
A():i() { } //初始化列表不能初始化静态成员变量
//A() { i = 0; }
void print() { cout << i << endl; }
void set(int ii) { i=ii; }
private:
static int i;
};
int A::i = ; //类内只是声明,没有定义,如果要使用必须要在类外的cpp文件进行定义
int main()
{
A a,b;
a.set();
b.print();
return ;
}

静态成员变量与成员变量就只有上述两个区别:
- 静态成员变量在所有这个类的对象中的值是保持一致的;
- 不能用构造函数初始化列表来做静态成员变量的初始化。
静态成员函数:
C++中静态成员函数和c中有较大的区别,主要的原因是:静态的成员函数设计初衷就是使此函数与对象无关
- C++中静态的成员函数只能调用 静态的成员函数和静态成员变量,而不能调用非静态的成员函数、变量;
- 静态成员函数中不能使用this指针,因为this是对象的this,完全可以在不定义对象的情况下访问类内的静态函数 " A::say(0); ";
#include <iostream>
using namespace std;
class A
{
public:
//A():i(0) { } //初始化列表不能初始化静态成员变量
A() { }
void print() { cout << i << endl; }
//void set(int ii) { i=ii; }
void set(int i) { this->i = i; } //this指针访问并修改静态成员变量是可以的
static void say(int ii)
{
cout << ii << endl;
cout << this->i << endl; //编译报错
cout << i << endl;
}
private:
static int i; }; int A::i = ; //类内只是声明,没有定义,如果要使用必须要在类外的cpp文件进行定义 int main()
{
A a,b;
a.set();
b.print(); a.say();
A::set(); //编译报错
A::say();
return ;
}

当我们把下边这两行注释掉后,编译运行就没问题了
cout << this->i << endl; //编译报错
A::set(2); //编译报错

特别鸣谢:
看完这期视频简直就是太崇拜翁恺老师了,建议对一些c++基础比较模糊的同学好好看看翁恺老师的视频,比看书和看博文有用多了,不仅给讲原理还会给将实现,毕竟c++可以用c来全部实现的,视频链接在上一篇内有,看完视频真的不夸张的说“胜读十年书”,只能说浙大的同学们有福了,这么早就有这么好的启蒙老师。
目录
- c++(翁恺浙大公开课) 笔记0
- static在c\c++中的作用(翁恺c++公开课[28-29]学习笔记)
- c++对象初始化(翁恺c++公开课[10])
- c++构造函数的初始化列表(翁恺c++公开课[13])
- c++继承:公有、私有、保护
- c++子类父类关系(翁恺c++公开课[15-16]学习笔记)
- c++拷贝构造函数(翁恺c++公开课[26-27]学习笔记)
- c++多态性及多态的内部实现(翁恺c++公开课[23-24])
- c++中的运算符重载operator1(翁恺c++公开课[30]学习笔记)
- c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)
- c++模板(翁恺c++公开课[34-35]学习笔记)
- 最好不要在头文件中写函数定义
static在c\c++中的作用(翁恺c++公开课[28-29]学习笔记)的更多相关文章
- c++中的Exceptions异常处理(翁恺c++公开课[36])
Exceptions用于处理Run-time Error: //文件读取的异常捕获伪代码 try{ open the file; determine its size; allocate that m ...
- c++中的运算符重载operator2(翁恺c++公开课[31-33]学习笔记)
上一篇operator1中,大概说了下重载的基本用法,接下来对c++中常见的可重载运算符归一下类,说一下它们的返回值,讨论下较为复杂的运算符重载上的坑
- c++中的运算符重载operator1(翁恺c++公开课[30]学习笔记)
运算符重载规则: 只有已经存在的运算符才能被重载,不能自己制造一个c++中没有的运算符进行重载 重载可以在类或枚举类型内进行,也可以是全局函数,但int.float这种已有的类型内是不被允许的 不能二 ...
- c++拷贝构造函数(翁恺c++公开课[26-27]学习笔记)
这节课在p26.拷贝构造中讲的很清楚,建议大家耐心的去看下. 什么时候会发生拷贝构造: 对象之间的初始化赋值 使用对象作为变量进行函数传参(通常使用引用来传参从而减去不必要的拷贝构造,提高效率和代码健 ...
- c++多态性及多态的内部实现(翁恺c++公开课[23-24])
多态是在父类函数的前面加上 “virtual” 关键字,使子类与父类同名的函数产生一种联系: 多态会用到两个特性:向上造型.动态绑定 向上造型是指:拿一个子类对象当作父类来看待,比如下边代码中的子类E ...
- c++构造函数的初始化列表(翁恺c++公开课[13])
初始化列表形式: class Point { private: const float x,y; Point(float xa = 0.0, flato ya = 0.0):y(ya),x(xa) { ...
- c++对象初始化(翁恺c++公开课[10])
c++对象初始化 就是去调用构造函数来完成初始化操作: 构造函数有无参数的构造函数.有参数构造函数.默认构造函数(编译器给我们实现的)...(拷贝构造函数之后说) 注意:默认构造函数只有在我们自己没有 ...
- c++子类父类关系(翁恺c++公开课[15-16]学习笔记)
关于类的继承有三种:public继承.private继承.protected继承 首先说明,关于类的成员变量.函数的权限有三种(public.private.protected) 我们通常会让所有的成 ...
- c++模板(翁恺c++公开课[34-35]学习笔记)
为什么要有模板(templates):当我们需要一个列表(list),列表中元素可能都为X类型也可能都为Y类型,怎么来实现呢? 定义基类?可以实现,很多情况下可能不够简明的表达设计思想 克隆代码(写一 ...
随机推荐
- 6_9 天平(UVa839)<二叉树的DFS>
前一个ubiquous通信小工具,移动只是一个由弦和电线组成的结构五彩缤纷的东西.这种移动通常被发现悬挂在小婴儿的摇篮.图说明了一个简单的移动.它只是一个电线,悬挂的一个字符串,每一个对象的对象.它可 ...
- opencv:像素统计信息
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace st ...
- 在 Fabric 中使用私有数据
本教程将演示收集器(collection)的使用,收集器为区块链网络上已授权的组织节点 提供私有数据的存储和检索. 本教程假设您已了解私有数据的存储和他们的用例.更多的信息请参阅 私有数据 . 本教程 ...
- 原生js按回车键实现登录
这篇文章主要介绍了原生JS按回车键实现登录的方法,众所周知,这是在web程序设计中的一个非常实用的小技巧,主要用于表单提交,包括注册.登录等等功能,具有很好的用户体验,有着非常广泛的实用价值,需要的朋 ...
- netty笔记-:Channel与ChannelHandlerContext执行write方法的区别
在netty中有我们一般有两种发送数据的方式,即使用ChannelHandlerContext或者Channel的write方法,这两种方法都能发送数据,那么其有什么区别呢.这儿引用netty文档 ...
- Tomcat部署Web项目的3种方式
一.将war包丢进webapps 这是最简单粗暴的方式:将web工程打成war,丢进tomcat/webapps目录即可,tomcat会自动解压.无需修改任何配置文件即可完成部署. 这里我准备了tom ...
- DreamWeaver CC 中的回车
在Dreamweaver CC中换行有两种: 第一种是在设计视图中直接回车,对应的代码是<p>标签,即新生成一个段落. (注:在DreamWeaver CC编辑的代码中,按下回车相当于 ) ...
- U2000解决备份:服务器不可达、FTP/TFTP/SFTP IP地址与网管地址不一致
只需要将一下几点设置到位这些问题基本解决: 设置->网元软件管理->FTP设置 如果你的U2000服务器和OLT都在一个内网,那么就IP1和IP2就都输入U2000服务器的内网IP,否则按 ...
- stl_vector复习
#include <iostream>#include <vector>#include <algorithm> //for_each#include <ct ...
- java 8 list的stream操作 list中的对象中的某一个成员取出转为该成员的list,以及对象过滤,筛选某个属性后的成员
取成员属性list List<String> configList = codeEntityList.stream().map(t -> t.getName()).distinct( ...