C++中static、const使用方法简介
众所周知,在c++中,static和const的使用方法是难点,也是重点,值得我们随时温习,所谓温故而知新是也。
下面我们首先说一说static。
1、static的作用
static变量的作用,主要可以归纳为以下几点
a、可以隐藏,如果在函数体外声明成员变量,非static的成员变量,在A.cpp中声明:int a;那么这样其他源文件比如B.cpp是可以访问到A.cpp中的a的。这样极容易混淆,因为我们可能需要在B.cpp中声明int a;而且也是对数据的一种保护,使A更安全。
而如果在A.cpp中声明的是:static int a;那么只能在该文件中访问了,在B.cpp中访问不到a.这也间接的实现了封装的效果。很多时候对于我们数据的设计是非常有好处的。
b、声明为static的变量还具有持久性,这里说的持久性就是不依靠对象的改变而存在与否,因为static是属于整个类的,他的声明周期是源程序存在的声明周期,不会以为某个对象new而产生然后delete而消失。这是static的一个非常重要的特性,甚至是最重要的特性。因为对于某些数据需要全体用户共享的时候,static无疑是一种非常棒的解决方案。
c、默认初始化。我们知道非static变量在全局变量中是会进行初始化的,但是在局部变量中,比如函数体内部是不会初始化的。但是static变量则不然,他会在所有情况下进行初始化。如static int a;a会初始化为0.
类中static的作用。
static 数据成员必须在内定义的外部进行定义,在类定义体中定义是错误的。

而应该在函数体外部定义
double Accout::interestRate=0.09;
double Accout::getNum(){
return interestRate;
}
类中静态成员函数
不能访问非静态函数或者变量。因为静态成员函数是属于类而不是某个对象,但是非静态函数和变量是属于某个对象的。所以静态不能访问非静态。
但是反过来,非静态是可以访问静态的。毕竟静态是一直存在,属于整个类。相信这个应该是非常容易理解的。
static函数中不能使用this关键字,因为this一般指当前对象,而static不属于任何对象。
不能声明为virtual虚函数,虚函数的主要作用是实现多态,大家想象一下static。多态对static是没有意义的,他压根不属于对象呀!
static函数比普通函数访问的速度快很多。这个可以解释为普通函数需要首先访问当前对象,然后再访问当前对象的成员函数。这之间有多步转化,他能快的过static函数么?
当然static关键字和普通成员或者函数都遵从private,public,protected访问规则的。
const用法
const直观的理解就是常量且不可修改。但是const的意义远不止如此,下面让我们一一解剖:
const int a=30;
常量:a必须赋值,不赋值是不被允许的。试想如果不赋值,又因为const不可修改性,那么a定义有意义吗?这也是const变量必须赋予初始值得直接原因。
既然是常量,那么是不是想到了经常用到的
#define a 30;
确实,上述语句也能够使a是常量。是不是const和define就是等价的呢?至少在这个用法上是等价的呢?
当然不是,在程序运行是#define a 30;出现a只是简单的用30来代替,出现多次就代替多次。重复这样的过程会出现多个副本的产生,但是const就不会出现这种情况,永远保持一个副本;其次define也不能定义数据类型啊。
这里再讲define需要注意的一个微小细节:
#define fun(x) (x*x);
程序中出现fun(5),会用(5*5)替换
但是出现fun(5+6),只会用(5+6*5+6)代替。而不是(11*11).
所以我们尽量少用define,多用const和inline内联函数。
const指针用法:
我们这里说两种指针,常量指针和指向常量的指针。如下:

指向常量的指针可以通过x改变,然后p中指向的值也改变了。
但是类似*p=40;这样修改是不被允许的。
const参数和返回值
表示返回的参数应该是const。const参数则表示该传过去的参数是不可修改的。
说到这里当函数返回指针的时候,一定不能返回局部变量,因为函数在退出的时候,函数中的栈空间也清除了(局部变量会存储在该空间中)。返回的已经不是我们需要得到的了,很可能返回乱码。
class中const使用。
const 数据成员。成员只能在构造函数中初始化,不能在类声明外初始化和static有比较大区别。
类中的函数例如 void fun()const;表示不可改变当前对象。不可改变当前对象可以理解为,不能对当前对象中的成员进行左值操作!
总结:static,const,const static初始化总结:
static在class声明外初始化。
const在构造函数中初始化,若没有构造函数就悲剧了。
const static和static const一样,在类外初始化。
class Accout{
public:
Accout();
static double interestRate;
const static double a;
const double c;
int b;
};
const double Accout::a=;
double Accout::interestRate=0.09;
Accout::Accout():c(){}
转载请注明出处:http://www.cnblogs.com/xiaoyi115/p/3622891.html
不足之处敬请指正!
C++中static、const使用方法简介的更多相关文章
- Python Python-MySQLdb中的DictCursor使用方法简介
Python-MySQLdb中的DictCursor使用方法简介 by:授客 QQ:1033553122 DictCursor的这个功能是继承于CursorDictRowsMixIn,这个Mi ...
- java中static变量和方法的总结
转自:http://blog.csdn.net/haobo920/article/details/5921621 java中static变量和方法的总结 java中一切皆是对象 一个类中对象的定义一般 ...
- java中static,final,private方法的继承多态问题
父类中的final private方法不能被继承,父类中的static方法可以被继承,但是不能重写,这三者都属于前期绑定,java中除了这三种以及构造方法之外剩下的都是后期绑定(运行是绑定). 当父 ...
- C/C++中static,const,inline三种关键字详细总结
一.关于staticstatic 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因.作用谈起,全面分析static 修饰符的实质. static ...
- Android中GPS类及方法简介
GPS是Global Positioning System(全球定位系统)的简称,它的作用就是为全球的物体提供定位功能.GPS定位是一门高新技术,但对于Android程序员来说,开发GPS功能的应用程 ...
- jQuery编程中的一些核心方法简介
调用 jQuery 对象的方法很简单: $('h1').remove(); 大多数 jQuery 方法都是像上面这样被调用的,这些方法都位于 $.fn 命名空间内,这些方法称为 jQuery 对象方法 ...
- javascript中window.location.search方法简介
window.location.search方法是截取当前url中"?"后面的字符串,示例如下: 例如:http://www.firefoxchina.cn/?ntab截取后的字符 ...
- php中socket的使用 方法简介
一.开启socket phpinfo();查看是否开启了socket扩展,否则在php.ini中开启. 二.服务器端代码的写法 <?php error_reporting(E_ALL); set ...
- C++ 中 static 与 const 的用法及对比
在这个学习过程中我对 static 及 const 的使用时常会混淆,因此整理,加深记忆 一.类的静态成员 如果某个属性为整个类所共有,不属于任何一个具体对象,则采用 static 关键字来声明静态成 ...
随机推荐
- 【转载】Unity3D研究院之IOS自定义游戏摇杆与飞机平滑的移动
移动开发游戏中使用到的触摸游戏摇杆在iPhone上是非常普遍的,毕竟是全触摸屏手机,今天MOMO 通过一个小例子和大家讨论Unity3D 中如何自定义一个漂亮的全触摸游戏摇杆. 值得高兴 ...
- (原)Unreal渲染模块 源码和实例分析说明
@author:白袍小道 说明 1.由于小道就三境武夫而已,而UE渲染部分不仅管理挺大,而且牵扯技术和内容驳杂,所以才有这篇梳理. 2.尽量会按书籍和资料,源码,小模块的调试和搬山(就是敲键盘)..等 ...
- sql 游标使用
declare @PASSDate datetime,@VLPN varchar(50),@VLPNColor varchar(10),@nambers int set @VLPN='';set @V ...
- mysql安装目录、配置文件存放位置
linux系统下,如何知道mysql使用的配置文件到底是哪个呢?linux自带的mysql的安装目录又是什么呢?数据存放在什么目录下? 1.linux系统自带的mysql,其安装目录及数据目录查看方法 ...
- C++寒假学习计划
课程 中国大学mooc西北工业大学c++程序设计 理由 本课程有48节,章节分类清晰,由许多小知识块组成,条例清晰便于学习,由基础开始,由浅入深,适合我这种小白. 计划 从2.8号至2.28除去2.1 ...
- 从 C10K 到 C500K
国外的 Urban Airship 公司的工程师在其官方网志上发文章介绍他们在产品环境中做到 50 万并发客户端,Java + Pure NIO 的实现,最近又有文章介绍针对 Linux Kernel ...
- SQL Server 重新编译存储过程的方式有三种
SQL Server 中,强制重新编译存储过程的方式有三种: sp_recompile 系统存储过程强制在下次执行存储过程时对其重新编译.具体方法是:从过程缓存中删除现有计划,强制在下次运行该过程时创 ...
- Redis String
Redis String Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下: 语法 redis 127.0.0.1:6379> COMMAND KEY_NAME ...
- tcp slowstart (TCP 慢启动)
tcp slowstart (TCP 慢启动) 慢启动定义 慢启动,是传输控制协议使用的一种拥塞控制机制.慢启动也叫做指数增长期.慢启动是指每次TCP接收窗口收到确认时都会增长.增加的大小就是已确认段 ...
- 【BestCoder #48】
与之前一样,秒刷A和B,然后就永远卡在了C B也因为少看一句话被Hunt掉了 说说C的做法吧(分块大法好 给定一个序列,每次询问区间l-r,求∑(ai^bi),其中bi是指ai在区间中的出现次数,ai ...