static与非static成员(函数)

 《C++ Primer》第4版399页:
对于特定类类型的全体对象而言,访问一个全局变量有时是必要的。然而,全局变量会破坏封装:对象需要支持特定类抽象的实现。如果对象是全局的,一般的用户代码就可以修改这个值。
鉴于此,类可以定义 类静态成员,而不是定义一个可普遍访问的全局对象。
 
通常,非static数据成员存在于类类型的每个对象中。然而,static数据成员独立于该类的任意对象而存在;
每个static数据成员是与类关联的对象,而不是与该类的对象相关联。
 
类也可以定义static成员函数。static成员函数没有this形参,它可以直接访问所属类的static成员,但不能直接使用非static成员。
注意:类的非static成员函数是可以直接访问类的static和非static成员,而不用作用域操作符。
 
使用static成员的优点:
(1)避免命名冲突:static成员的名字在类的作用域中,因此可以避免与其他类的成员或全局对象名字冲突。
(2)可以实施封装:static成员可以是私有成员,而全局对象不可以。
(3)易读性:static成员是与特定类关联的,可显示程序员的意图。
 
static成员 与 非static成员调用方法:
非static成员通过对象调用。
static成员通过作用域操作符(直接调用)、对象、引用、指向该类类型对象的指针(间接调用)
class Lunais{
 
static double zty();
double zzz;
 
};
Lunais z;
Lunais *t = &z;
double zty;
 
zty = Lunais::zty();  //static成员通过作用域操作符(直接调用)
zty = z.zty();    //static成员通过对象(简接调用)
zty = t->zty();   //static成员通过指向该类类型对象的指针(简接调用)
 
static数据成员定义:
1、一般情况下,static数据成员是类内声明,类外定义;
2、static成员不通过类构造函数初始化,而是在定义时进行初始化;
3、一个例外:初始化式为常量表达式,整型static const 数据成员(static const int) 可以在类的定义体内进行初始化:
 
class Lunais{
 
static const int zty = 30;
 
}
值得注意的是:const static数据成员在类的定义体中出始化时,该数据成员仍必须在类的定义体外定义,只是不再指定初始值:
const int Lunais::zty;
 
常实型 static const数据成员不可在类内初始化。一个好的解决方法是使用宏定义: #define zty 5421.5421

###########################################

以下引自:  http://blog.csdn.net/ljfeng123/article/details/20855515

###########################################

常整型静态数据成员可以在类中直接初始化,而常实型静态数据成员不可以

 class circle
{
int a;                        // 普通变量,不能在类中初始化
static int b;                   // 静态变量,不能在类中初始化
static const int c=2;               // 静态常整型变量,可以在类中初始化
static const double PI=3.1416;//error C2864:    //只有静态常量整型数据成员才可以在类中初始化
} ;
 
const int cicle::c ;  //const static数据成员在类的定义体中出始化时,该数据成员仍必须在类的定义体外定义,只是不再指定初始值
 
b可以在类外进行初始化,且所有对象共享一个b的值:
int circle::b = 2;
 
double circle::PI = 3.1416;

C++_static与非static成员(函数)的更多相关文章

  1. 非static成员函数通过类名::来调用,空指针调用成员方法不出错!

    首先来看这一段代码: #include <iostream> using namespace std; class A{ public: int k; void p1(){ cout< ...

  2. C++中的static数据成员与static成员函数

    本文要点: 1.static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联! aka:每个static数据成 ...

  3. C++类中的static数据成员,static成员函数

    C++类中谈到static,我们可以在类中定义static成员,static成员函数!C++primer里面讲过:static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在, ...

  4. static成员函数

    1.static成员函数不能定义为const的,这是因为static成员函数只是全局函数的一个形式上的封装,而且static成员函数不能访问类的非静态成员(没有this)指针,修改非静态数据成员又从何 ...

  5. 【编程拾遗】C++的static成员函数与单例模式

    static小结 static的引入 static 是C++中非经常常使用的修饰符,它被用来控制变量的存储方式和可见性. 函数内部定义的变量,在程序运行到它的定义处时,编译器为它在栈上分配空间,函数在 ...

  6. static成员函数不能调用non-static成员函数

    1 一般类静态成员函数不能调用非静态成员函数 2 static成员函数可以调用构造函数吗? 答案是肯定的,由于static成员函数没有this指针,所以一般static成员函数是不能访问non-sta ...

  7. static 成员函数

    和静态数据成员一样,静态成员函数是所有对象共享的,不是单独属于某一个对象,由于静态成员函数没有传递this指针,故static member function 只能访问static成员,不能访问非st ...

  8. static 成员变量、static 成员函数、类/对象的大小

    一.static 成员变量 对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量.比如说统计某种类型对象已创建的数量. 如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量 ...

  9. 为什么const对象只能调用const成员函数,而不能调用非const成员函数?

    在c++中,我们可以用const来定义一个const对象,const对象是不可以调用类中的非const成员函数,这是为什么呢?下面是我总结的一些原理. 假设有一个类,名字为test代码如下: clas ...

随机推荐

  1. hdu4289 最小割最大流 (拆点最大流)

    最小割最大流定理:(参考刘汝佳p369)增广路算法结束时,令已标号结点(a[u]>0的结点)集合为S,其他结点集合为T=V-S,则(S,T)是图的s-t最小割. Problem Descript ...

  2. 微軟将从 .NET 4 以后的版本弃用 System.Data.OracleClient 以及Oracle 的各种连接方法

    这是微软官方 ADO.NET Team Blog 去年就公布的消息: http://blogs.msdn.com/adonet/archive/2009/06/15/system-data-oracl ...

  3. 学习 Message(5): 关于 TApplicationEvents.OnMessage 的第二个参数 可以屏蔽 TWebBrowser右键菜单:

    http://www.cnblogs.com/del/archive/2008/10/25/1319318.html TApplicationEvents.OnMessage 的第二个参数 Handl ...

  4. CocoaPods安装和使用教程

    Code4App 原创文章.转载请注明出处:http://code4app.com/article/cocoapods-install-usage 目录 CocoaPods是什么? 如何下载和安装Co ...

  5. 线段树(多棵) HDOJ 4288 Coder

    题目传送门 题意:集合,add x, del x, 求和 分析:首先,暴力可以过这题.用上线段树能大大降低时间的消耗,具体就是类似开了5棵线段树,每个节点都有5个空间,表示该区间的id%5后的和,区间 ...

  6. HTML5属性运用

    HTML5 接触移动端,或专注于支持HTML5浏览器进行前端开发的工作者都不会陌生,这个已经普及很广,对于我专注于PC端开发的人来说,觉得陌生但又觉得很熟悉,大家都知道做PC前端开发为了兼容IE老版本 ...

  7. BZOJ3145 : [Feyat cup 1.5]Str

    如果不存在模糊点,那么答案就是两个串的最长公共子串. 如果模糊点是某个串的开头或者结尾,那么可以暴力枚举另一个串中的某个前后缀更新答案. 否则,假设模糊点在第一个串里是$i$,在第二个串里是$j$,那 ...

  8. BZOJ 3170 & 切比雪夫距离

    题意: 给出N个点,在这N个点中选一个点使其它的点与这个点的切比雪夫距离和最小. SOL: TJOI真是...厚道还是防水...这种题目如果知道切比雪夫距离是什么那不就是傻逼题...如果不知道那不就懵 ...

  9. 使用Percona Toolkit解决Mysql主从不同步问题【备忘】

    由于各种原因,mysql主从架构经常会出现数据不一致的情况出现,大致归结为如下几类 1:备库写数据 2:执行non-deterministic query 3:回滚掺杂事务表和非事务表的事务 4:bi ...

  10. Codeforces Round #233 (Div. 2) A、Pages

    #include <iostream> using namespace std; int main(){ int n,p,k; cin >> n >> p > ...