静态成员

由关键字static修饰说明的类成员,称为静态类成员(static class member)。虽然使用static修饰说明,但与函数中的静态变量有明显差异。类的静态成员为其所有对象共享,不管有多少对象,静态成员只有一份存于公用的内存中。

静态成员又分为静态成员函数,静态成员数据

静态数据

#include<iostream>
using namespace std; class Test
{
friend void fun(Test &t);
public:
Test(int d=)
{
count++;
data = d;
}
~Test()
{
count--;
}
private:
int data;
static int count;
}; int Test::count = ; void fun(Test &t)
{
cout << "t.data = " << t.data << endl;
cout << "Object count = " << Test::count << endl;
} int main()
{
Test t1();
Test t2();
fun(t1);
}

静态成员数据在类外初始化

静态函数

#include<iostream>
using namespace std; class Test
{
friend void fun(Test &t);
public:
Test(int d=)
{
count++;
data = d;
}
~Test()
{
count--;
}
void show1()
{
cout << "data = " << data << endl;
cout << "Object count = " << Test::count << endl;
}
static void show2()
{
cout << "Object count = " << Test::count << endl;
}
private:
int data;
static int count;
}; int Test::count = ; void fun(Test &t)
{
cout << "t.data = " << t.data << endl;
cout << "Object count = " << Test::count << endl;
} int main()
{
Test t1();
Test t2();
fun(t1);
}

静态方法只能访问静态变量,不能访问普通变量

普通方法技能访问静态变量,也能访问普通变量

为啥会这样呢?

对于类的普通成员函数,该函数必须经由一个对象去激活(有一个this指针)。

但是这条规则对于static修饰的成员函数(静态方法)不适用,静态方法没有this指针。我们代码里面访问data,实际上事以this->data这种方式,而静态函数连this都没有,他怎么能访问data呢?

#include<iostream>
using namespace std; class Test
{
friend void fun(Test &t);
public:
Test(int d=)
{
count++;
data = d;
}
~Test()
{
count--;
}
void show1()
{
cout << "data = " << data << endl;
cout << "Object count = " << Test::count << endl;
}
static void show2()
{
cout << "Object count = " << Test::count << endl;
}
void show3()
{
show1();
show2();
}
static void show4()
{
show2();
} private:
int data;
static int count;
}; int Test::count = ; void fun(Test &t)
{
cout << "t.data = " << t.data << endl;
cout << "Object count = " << Test::count << endl;
} int main()
{
Test t1();
Test t2();
fun(t1);
}

静态方法只能访问静态方法,不能访问普通方法

普通方法技能访问静态方法,也能访问普通方法

原因同上

const方法

#include<iostream>
using namespace std; class Test
{
friend void fun(Test &t);
public:
Test(int d=)
{
count++;
data = d;
}
~Test()
{
count--;
}
//void change(Test * const this) 导致this为常量
void change()
{
data--;
cout << endl;
}
//void change(Test * const this)const 演变成
//void change(const Test * const this) 导致*this 和 this都是常量
void change()const
{
//data--;
cout << endl;
} private:
int data;
static int count;
}; int Test::count = ; void fun(Test &t)
{
cout << "t.data = " << t.data << endl;
cout << "Object count = " << Test::count << endl;
} int main()
{
Test t1();
Test t2();
fun(t1);
}

const常方法限定该函数不能修改类的数据成员

#include<iostream>
using namespace std; class Test
{
friend void fun(Test &t);
public:
Test(int d=)
{
count++;
data = d;
}
~Test()
{
count--;
}
void show1()
{
cout << endl;
}
void show2() const
{
cout << endl;
}
//void change1(Test * const this) 导致this为常量
void change1()
{
show1();
show2();
}
//void change2(Test * const this)const 演变成
//void change2(const Test * const this) 导致*this 和 this都是常量
void change2()const
{
//show1();
show2();
} private:
int data;
static int count;
}; int Test::count = ; void fun(Test &t)
{
cout << "t.data = " << t.data << endl;
cout << "Object count = " << Test::count << endl;
} int main()
{
Test t1();
Test t2();
fun(t1);
}

普通方法能够调用常方法

常方法不能调用普通方法

C++——static & const的更多相关文章

  1. static、const和static const

    http://blog.csdn.net/rainkin1993/article/details/8068558 #include<iostream> using namespace st ...

  2. static 类成员变量 和 static const类成员变量

    1.使用static类的优点: (1)避免与其他类的成员或者全局变量冲突 (2)可以封装 (3)阅读性好 2.static 数据成员独立于该类的任意对象而存在 static数据成员的类型可以是该成员所 ...

  3. static const vs. extern const

    在实现文件(.m文件)中使用static const来定义“只在编译单元内可见的常量”(只在.m文件内可见),由于此类常量不在全局符号表中,所以无须为其名称加类名前缀(一般以k开头). 在头文件中使用 ...

  4. iOS—— static和const联合使用;使用static const 与 #define

    static和const联合使用:   static将一个全局变量变成局部变量   const将一个局部变量变成局部常量 // 定义了一个局部常量      static const CGFloat ...

  5. Static Const

    Static 内部的 Const 不可变的 一般写法 在.m文件中, static NSString *const ID = @"shop"; static const CGFlo ...

  6. (转) C++ static、const和static const 以及它们的初始化

    const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. static表示的是静态的.类的静态成员函数.静态成员变量是和类相关的,而不是和类的 ...

  7. C++ static、const和static const 以及它们的初始化

    转自C++ static.const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. s ...

  8. 类内const static(static const)成员变量初始化问题

    在查找const相关资料的过程中,又遇到了另外一个问题,就是C++类中const static(或者static const)成员变量应当如何初始化的问题. 查阅了许多资料,发现VC环境下,只允许co ...

  9. How to initialize a static const map in c++?

    #include <map> using namespace std; struct A{ static map<int,int> create_map() { map< ...

  10. static const readonly

    C#中的static 和Java中的static 简单,两者用法完全是一致的.从两方面讨论: 1. 变量是属于类的,不是实例级别的.只能通过类名调用,不能通过实例调用. 2. 如果在定义时就赋值了,那 ...

随机推荐

  1. Silence Removal and End Point Detection JAVA Code(音频删除静音与结束判断)

    转载自:http://ganeshtiwaridotcomdotnp.blogspot.com/2011/08/silence-removal-and-end-point-detection_29.h ...

  2. LwIP应用开发笔记之一:LwIP无操作系统基本移植

    现在,TCP/IP协议的应用无处不在.随着物联网的火爆,嵌入式领域使用TCP/IP协议进行通讯也越来越广泛.在我们的相关产品中,也都有应用,所以我们结合应用实际对相关应用作相应的总结. 1.技术准备 ...

  3. LeetCode_231. Power of Two

    231. Power of Two Easy Given an integer, write a function to determine if it is a power of two. Exam ...

  4. layer confirm 三种选择按钮

    layer.confirm('请选择是否通过提现?(tips:同意直接打款,驳回不可恢复)', { btn : ['通过-打款','不通过','通过-已打款'], btn1:function(){ a ...

  5. Python第一阶段05

    1.内置方法: 2.Json序列化: import json info = { 'name': 'sisi', } f = open("test.text", "w&qu ...

  6. MySQL学习笔记——MySQL启动过程(一)

    首先去官网或者github下载MySQL5.7的源码. 官网地址:https://dev.mysql.com/downloads/mysql/ github地址:https://github.com/ ...

  7. LODOP计算结果值的合计

    LODOP中可以通过表达式等方式,计算结果并显示在LODOP预览打印的表格里,计算的是table中本来存在的数据,可以用tindex指定合计哪一列(相关博文:)那一列的数值是table中实际存在的,如 ...

  8. 【GStreamer开发】GStreamer基础教程09——收集媒体信息

    目标 有时你需要快速的了解一个文件(或URI)包含的媒体格式或者看看是否支持这种格式.当然你可以创建一个pipeline,设置运行,观察总线上的消息,但GStreamer提供了一个工具可以帮你做这些. ...

  9. Head First Design Patterns HeadFirst 设计模式

    OO原则是我们的目标,而设计模式是我们的做法. 策略模式 (Strategy) 在软件开发上,一直不变的真理是"change".不管软件设计的多好,一段时间之后,总是要成长与改变, ...

  10. Rsync同步部署web服务端配置

    Rsync同步部署web服务端配置 1,参数详解: -v, --verbose 详细模式输出. -q, --quiet 精简输出模式. -c, --checksum 打开校验开关,强制对文件传输进行校 ...