-
2015-11-27 13:23:58
一、static变量有什么作用呢?
(1) 在函数体内,值维持不变,具有“记忆”功能;
(2)在模块内(但在函数体外),不能被模块外的其他函数访问;
(3)只在一个源文件中有效,不能被其他源文件使用。引申:static变量只初始化一次
分析以下一段代码:#include<stdio.h> void fun(int i) { static int value=i++;//static的初始化语句只执行了一次 value=i++; printf("%d\n",value); } int main() { fun(0); fun(1); fun(2); return 0; }
程序输出为
1
1
2在调用fun(0)后再次调用fun(i)函数时,程序会跳过static变量的定义语句,只执行value=i++语句。
二、在C++中,类内数据成员声明前加上static就变成了静态数据成员,有以下特点:
(1)该类的所有对象共享访问该静态数据成员的一份复制品,而不是每个对象都有该成员的复制
(2)静态数据成员存储在全局数据区
(3)它与普通数据成员一样遵从public、protected、private访问规则
(4)static成员变量的初始化是在类外,此时不能再带上static关键字。类的 静态数据成员在 类内只能声明,定义和初始化必须在类外注意:在头文件中定义静态变量的做法不可行,如果在使用了该头文件的每个C/C++语言文件中定义静态变量,编译后,在每个头文件中都会单独存在一个静态变量,会造成资源的浪费,也可能引起程序错误。
更多相关内容 -
【C++】 常对象、常数据成员、常成员函数总结
2019-03-24 15:07:25常数据成员 ◆ 常数据成员必须进行初始化,并且不能被更新。 ◆ 常数据成员不能在声明时赋初始值(普通数据成员也是),常数据成员必须在构造函数初始化列表进行初始化;普通数据成员在初始化列表和函数体中初始...常数据成员
◆ 常数据成员必须进行初始化,并且不能被更新。
◆ 常数据成员不能在声明时赋初始值(普通数据成员也是),常数据成员必须在构造函数初始化列表进行初始化;普通数据成员在初始化列表和函数体中初始化均可。
◆ PS:类的成员对象若要传入参数初始化,则必须在构造函数初始化列表进行;(成员对象:当一个类的成员是另一个类的对象时,这个对象就叫成员对象。)
常对象
◆ ⭐常对象可以调用常成员函数,不能调用非const成员函数;非const对象,可以调用普通成员函数和常成员函数。
◆ 常对象的成员函数不一定都是常成员函数;同样的常对象的数据成员不一定都是常数据成员。
◆ 常对象一旦初始化,常对象的数据成员便不允许修改,而不是说常对象的数据成员都是常数据成员。
◆ PS:定义常对象有两种方法,1. Point const a; 2. const Point a;(同样的,定义变量或指针时,const放前放后意义一样,如:1. const double a; double const a; 2. const int *p; int const *p; 但是定义指针常量时,只能用 int * const p;)
常成员函数
◆ 常成员函数不更新对象的数据成员。
◆ 常成员函数的const关键字可以被用于参与对重载函数的区分。
◆ ⭐通常非const成员函数需要定义一个const版本的重载函数,以方便定义常对象后调用常成员函数。
◈ 如果常对象调用的常成员函数返回的是指向当前对象的指针(或返回的是当前对象),那么此常成员函数的声明的返回类型要加const,例如:◊ 成员函数返回指向当前对象的指针
const *Point fun1(); //非const成员函数的类内声明;
const *Point fun1() const; //习惯上要再声明一个常成员函数作重载函数,注意到此函数声明有两个const;◊ 成员函数返回指向当前对象
const Point fun1(); //非const成员函数的类内声明;
const Point fun1() const; //习惯上要再声明一个常成员函数作重载函数,注意到此函数声明有两个const;◊ ⭐注意,如果一个类中声明以下4个重载函数:
① Point fun1();
② const Point fun1();
③ Point fun1() const;
④ const Point fun1() const;
【解析】①和②是冲突的,因为无法区分仅按返回类型区分的重载函数;③和④是冲突的,也是因为无法区分仅按返回类型区分的重载函数。
所以正确的重载函数搭配有3种:◊ ①和③搭配:
Point fun1(); //函数返回非const对象
Point fun1() const; //函数返回非const对象
[解析]适用于定义常对象后调用常成员函数,常成员函数返回类型是非const的Point类对象。◊ ①和④搭配(这里把返回类型改为指针,因为常用):
Point *fun1() {return this; }; //函数返回指向本对象的指针
const Point *fun1() const { return this; };//函数返回指向本常对象的指针,第一个const说明返回的是指向常对象的指针,第二个const说明此函数是常函数[解析]适用于定义常对象后调用常成员函数,常成员函数返回类型是常Point类对象(如return *this;)。
◊ ②和④搭配:
const Point fun1(); //函数返回常对象
const Point fun1() const; //函数返回常对象
[解析]适用于定义常对象后调用常成员函数,常成员函数返回类型是常Point类对象。◊ ②和③搭配:
const Point fun1();
Point fun1() const;
[解析]虽然搭配合法,但是似乎不存在这种搭配。 -
C++类中的常数据成员和静态数据成员的区别
2013-09-20 01:19:26刚开始学习C++的类和对象的部分,对类中的常数据成员和静态数据成员的概念和用法经常混淆,所以今天整理一下,顺便说一下,今天是我的生日,祝我生日快乐,呵呵。 常数据成员 常数据成员是指在类中定义的不能修改其...刚开始学习C++的类和对象的部分,对类中的常数据成员和静态数据成员的概念和用法经常混淆,所以今天整理一下,顺便说一下,今天是我的生日,祝我生日快乐,呵呵。
常数据成员
常数据成员是指在类中定义的不能修改其值的一些数据成员,类似于我们以前学过的常变量,虽然是变量,也有自己的地址,但是一经赋初值,便不能再被修改。
适用于类中定义一些初始化之后不希望被修改的变量。
定义方法:
const 类型名 变量名;
(1)类中的常数据成员只能通过构造函数的参数初始化表进行初始化。
(2)常数据成员是实例化对象的一部分,可以用this指针访问。
#include<iostream> using namespace std; class Happy_birthday { public: Happy_birthday(char * na):name(na){} void Print() { cout<<name<<" Happy Birthday!"<<endl; } private: const char * name; }; int main() { Happy_birthday qianshou("赵哲"); qianshou.Print(); return 0; }
运行结果:
静态数据成员
其实常数据成员和静态数据成员完全是两码事,只不过一开始学习的时候容易混淆罢了。通过上面的解释,我们知道常数据成员类似常变量,是一种一经赋值就不可以改变的变量。
它们最大的区别就是静态数据成员是可以被修改的,而且可以被任何一个对象修改,修改后的值,可以被所有的对象共享。
静态数据成员是属于一个类的而不是某一个对象,它是为该类所定义的所有的对象所共有。该类所定义的对象都可以引用该静态成员,并且值都是一样的。
静态数据成员的存储空间不同于普通的数据成员,它不属于类的任何一个对象,是独立于对象存储的,因此也不可以通过对象的this指针来访问。
并且,静态数据成员不可以用参数初始化表进行初始化操作,原因很简单,因为初始化表是在定义对象的时候进行的利用了this指针进行操作,所以不可以。
静态数据成员的定义的方式:
static int num;
访问方式:
可以通过类名直接访问:
Test::s_num;
也可以通过对象名访问:one.s_num;
不过为了区别于其他的成员变量, 一般使用类名进行访问,因为静态数据成员不属于对象,以免使人误解。#include<iostream> using namespace std; class Test { public: Test(int n):c_num(n){};//只能用初始化表对常数据成员赋初值 void show() { cout<<"c_num:"<<this->c_num<<endl; cout<<"s_num:"<<s_num<<endl; } void change(int n) { s_num=n; } static int s_num; private: const int c_num; }; int Test::s_num=100;//在类体为对静态数据成员赋初值 int main() { Test one(10); one.show(); one.change(10000);//改变静态数据成员的值 cout<<"one changeed:"<<one.s_num<<endl; //使用对象名one间接访问静态数据成员 cout<<"Test changeed:"<<Test::s_num<<endl;//使用类名直接访问静态数据成员 Test two(20); cout<<"two changeed:"<<two.s_num<<endl; //使用对象名two间接访问静态数据成员 two.change(99); cout<<"Test changeed:"<<Test::s_num<<endl;//使用类名直接访问静态数据成员 return 0; }
运行结果:分析:
我们在程序中可以使用类名直接访问静态数据成员变量,就直接说明了它不属于任何一个对象的这个特点。
我们在定义对象two的时候只对c_num进行了赋值,但是我们使用two.s_num进行输出的时候也是可以输出的,这也说明了这个数据成员确实可以被所有的对象进行引用,并且值都是相同的,因为它本身就不属于任何一个对象。
好啦,大家晚安!
-
静态成员特点
2018-07-23 21:47:32(1)static数据成员在类的内部声明,但只能在类的外部定义,在类的外部不能指定static,在类的定义时候进行初始化; (2)static数据成员只能在类的外部进行初始化(特例:当整型const static数据成员被常量表达式...(1)static数据成员在类的内部声明,但只能在类的外部定义,在类的外部不能指定static,在类的定义时候进行初始化;
(2)static数据成员只能在类的外部进行初始化(特例:当整型const static数据成员被常量表达式初始化时,就可以在类的内部进行初始化,但还需要在外部进行定义)。
(3) static数据成员可以是该成员所属的类类型,而非static数据成员只能自身类的引用或者指针。
(4)static数据成员可以用作类成员函数的默认实参。
(5)static数据成员的值可以改变。
二、静态成员和非静态成员的区别:
(1) 静态变量使用 static 修饰符进行声明,在类被实例化时创建,通过类和对象都可以进行访问;
(2)不带有 static 修饰符声明的变量称做非静态变量,在对象被实例化时创建,通过对象访问;
(3) 一个类的所有实例的同一静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值。
(4) 静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等。
三、静态成员函数的特点:
(1) static 成员函数没有 this 形参,它可以访问所属类的 static 成员,但不能访问非 static 成员。
(2)static成员函数既可以在类的内部定义,也可以在类的外部定义,在外部定义时,不能重复指定static保留字。
(3)static成员函数不能声明为虚函数,不能实现动态绑定
(4)static 成员函数不能声明为const,因为const是针对this是不是const而言的
(5)构造函数、析构函数不能为静态函数。
公有继承的私有成员不能被继承,无法访问
公有继承的保护成员,只能在派生类中访问,不能用派生类对象访问
私有继承的公有成员,成员被私有化,无法访问
(int&)b 是将b地址中对应的数据按照规定的int格式方式显示出来
- pA2=static_cast<ClassA*>(pB); 类型转换无效
- 正确
- pA2=pB; 类型转换无效
- pA2=static_cast<ClassA*>(static_cast<ClassC*>(pB)); 转换有效
static_cast 的用法
static_cast < type-id > ( expression )
该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:
①用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。
进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
③把空指针转换成目标类型的空指针。
④把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性。
C++中的static_cast执行非多态的转换,用于代替C中通常的转换操作。因此,被做为显式类型转换使用。
C++中的reinterpret_cast主要是将数据从一种类型的转换为另一种类型。所谓“通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式的重新解释。
-
[c++] 常成员函数
2020-02-19 12:42:25常成员函数的主要特点: 1)不能更新类的成员变量 2)不能调用该类中没有用const修饰的成员函数,即只能调用常成员函数 3)可以被类中其它的成员函数调用 4)常对象只能调用常成员函数,而不能调用其他的成员函数。 ... -
类中的数据成员
2019-06-12 21:55:00静态数据成员 静态成员只属于类,不属于对象。该类的所有对象都共享同一个静态成员。静态成员的申明是使用static关键字。正因为静态成员数据不属于任何一个对象,因此其初始化不应该有构造对象来进行初始化。其初始... -
c++中什么是静态数据成员 什么是静态成员函数 分别有什么作用?
2018-08-14 11:59:22静态数据成员: 就是说在这个类中是固定的,只有一个。比如说中国人是一个类,那么这个中国人的总人口数就是一个静态数据成员,这个静态数据成员不会跟随某个具体的人,而是正对于这个类的。静态成员函数,一般这些... -
python基本数据类型的特点
2019-04-30 17:57:57Python基本数据类型的特点 Python整型和浮点型 一,python整数类型所表示的数据。 1,一般用以表示一类数值:所有正整数,0和负整数; 2,整型作为最常用的,频繁参与计算的数据类型,在pyt... -
抽象类的成员特点
2018-07-19 00:23:19抽象类的成员特点 A:抽象类的成员特点 a.成员变量:既可以是变量,也可以是常量。abstract是否可以修饰成员变量?不能修饰成员变量 b.构造方法:有。 用于子类访问父类数据的初始化。 c.成员方法:既可以是抽象... -
Java中抽象类的成员特点
2019-04-24 11:29:42- A:抽象类的成员特点 a.成员变量:既可以是变量,也可以是常量。abstract是否可以修饰成员变量?不能修饰成员变量 b.构造方法:有。 用于子类访问父类数据的初始化。 c.成员方法:既可以是抽象的,也可以是非抽象的... -
类的静态数据成员和静态成员函数浅析
2015-04-28 10:23:20类中的数据成员声明前加上static,则表示该数据成员为静态数据成员。除了与其他数据具有相同的public/private/protect访问属性外,还有一些其他的属性: 1、不能在类中进行初始化,只能在类外。 因为静态数据... -
json数据的特点
2017-03-13 22:17:47json是一种轻便量级的数据交换格式,具有良好的可读和便于快速编写的特性。可以在不同的平台间进行数据交换。json是javaScript对象表示语法的子集。json中只有两种结构:对象和数组.json的值由数字、字符串、逻辑值... -
静态成员(静态成员函数,静态数据成员)的特性
2012-11-06 11:51:16静态数据成员 定义格式: static 数据类型 静态数据成员名; 初始化格式: 数据类型 类名::静态数据成员名 = 初始化值; 公有静态数据成员的访问格式: 1. 类名::静态数据成员名 2. 对象.静态数据... -
C语言中的static变量和C++静态数据成员 的访问情况
2015-03-16 17:20:38C++中静态数据成员的特点有:: 1、静态数据成员 仅仅在初始化时不受访问权限的约束 ; 2、静态数据成员 最好不要在.h文件中进行定义(初始化),而是放在.cpp文件中定义(初始化) ; ... -
C++类中必须用初始化表初始化的数据成员
2016-08-09 15:22:14static类型的数据成员为静态成员, 他的特点是: 无论对象创建了多少个, 该数据成员的实例只有一个, 会被该类所创建的所有对象共享, 其中任何一个对象对其操作都会影响到其他对象。该类型的数据初始化是放在类外 -
static数据成员与static成员函数
2013-05-13 11:51:45定义:用static关键字声明的数据成员称为静态数据成员。 每个类只有一个存储单元,静态数据成员为该类的所有对象共有,不属于某个对象。静态数据成员的初始化必须在类以外进行定义性说明。 形式为:类型> 类名>:... -
C++类的常成员函数以及静态成员函数
2016-02-15 11:37:111 常成员函数 1.1声明:函数名(形参列表)const; 1.2说明: 1)const是函数类型的一部分,在实现部分也要带上该关键字; 2)const关键字可以用于对重载函数的区分; 3)常成员函数不能更新类的成员变量,也不... -
C# 静态成员和实例成员
2019-05-14 17:13:14前言:我们都知道,类是对象的抽象,对象是类的实例,对象有自己的属性和方法,万物皆对象,不可避免的,类也是一种对象,也有它自己的方法和属性,类的成员称为静态成员,包括静态数据和静态方法,而类实例化出的... -
数据结构:八大数据结构分类
2018-09-05 18:23:28数据结构分类 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成 。 常用的数据结构有:数组,栈,链表,队列,树,图,堆,散列表等,如图所示: 每一种数据结构都... -
Java之静态成员
2018-12-29 16:12:34静态成员最主要的特点是它不属于任何一个类的对象,它不保存在任意一个对象的内存空间中,而是保存在类的公共区域中,所以任何一个对象都可以直接访问该类的静态成员,都能获得相同的数据值,修改时,也在类的公共..... -
数据结构简介与特点
2017-05-18 17:38:46数据结构简介与特点线性表 顺序表 单链表 循环链表 双向循环链表 静态链表 栈 顺序栈 链栈 队列 顺序队列 链队列 循环队列 串 串的定长存储 串的堆分配存储 串的块链存储 树 树的双亲表示法 树的孩子兄弟表示法 ... -
静态成员和静态成员函数的总结
2018-12-20 23:01:01(2)static数据成员只能在类的外部进行初始化(特例:当整型const static数据成员被常量表达式初始化时,就可以在类的内部进行初始化,但还需要在外部进行定义)。 (3) static数据成员可以是该成员所属的类类型... -
Java 结构化数据处理开源库 SPL
2022-03-16 08:08:32现代Java应用架构越来越强调数据存储和处理分离,以获得更好的可维护性、可扩展性以及可移植性,比如火热的微服务就是一种典型。这种架构通常要求业务逻辑要在Java程序中实现,而不是像传统应用架构中放在数据库中... -
【JAVA高级技术】Java 处理结构化数据多种解决方案
2022-04-23 23:07:18Java 处理结构化数据多种解决方案 -
❤️ 爆肝三万字《数据仓库体系》轻松拿下字节offer ❤️【建议收藏】
2021-09-11 16:18:20特点:设计思路自上而下,适合上游基础数据存储,同一份数据只存储一份,没有数据冗余,方便解耦,易维护,缺点是开发周期一般比较长,维护成本高。 详见后文:三范式与反范式 2.3 Data Vault模型 DataVault由Hub... -
数据结构:八种数据结构大全
2021-07-29 12:36:10数据结构 1.1 数据结构概述 数据结构是计算机存储、组织数据的方式;通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构的优良将直接影响着我们程序的性能;常用的数据结构有:数组(Array)... -
静态数据成员
2011-08-25 10:12:01静态类成员包括静态数据成员和静态函数成员两部分。 一 静态数据成员: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也... -
数据库, 数据仓库, 数据集市,数据湖,数据中台
2019-02-22 16:21:47数据仓库和数据集市的区别 作者:修鹏李 出处:CSDN 大数据:数据仓库和数据库的区别 作者:南宫蓉 出处:简书 第一篇:数据仓库概述 第二篇:数据库关系建模 作者:穆晨 出处:CNBLOS 摘要 本文简要介绍... -
C++静态数据成员定义及应用浅谈
2012-08-24 14:23:10同时,静态数据成员还具有以下特点: 1.C++静态数据成员的定义。 静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。 其定义方式与全局变量相同。举例如下