C++——static & const
静态成员
由关键字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的更多相关文章
- static、const和static const
http://blog.csdn.net/rainkin1993/article/details/8068558 #include<iostream> using namespace st ...
- static 类成员变量 和 static const类成员变量
1.使用static类的优点: (1)避免与其他类的成员或者全局变量冲突 (2)可以封装 (3)阅读性好 2.static 数据成员独立于该类的任意对象而存在 static数据成员的类型可以是该成员所 ...
- static const vs. extern const
在实现文件(.m文件)中使用static const来定义“只在编译单元内可见的常量”(只在.m文件内可见),由于此类常量不在全局符号表中,所以无须为其名称加类名前缀(一般以k开头). 在头文件中使用 ...
- iOS—— static和const联合使用;使用static const 与 #define
static和const联合使用: static将一个全局变量变成局部变量 const将一个局部变量变成局部常量 // 定义了一个局部常量 static const CGFloat ...
- Static Const
Static 内部的 Const 不可变的 一般写法 在.m文件中, static NSString *const ID = @"shop"; static const CGFlo ...
- (转) C++ static、const和static const 以及它们的初始化
const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. static表示的是静态的.类的静态成员函数.静态成员变量是和类相关的,而不是和类的 ...
- C++ static、const和static const 以及它们的初始化
转自C++ static.const和static const 以及它们的初始化 const定义的常量在超出其作用域之后其空间会被释放,而static定义的静态常量在函数执行后不会释放其存储空间. s ...
- 类内const static(static const)成员变量初始化问题
在查找const相关资料的过程中,又遇到了另外一个问题,就是C++类中const static(或者static const)成员变量应当如何初始化的问题. 查阅了许多资料,发现VC环境下,只允许co ...
- How to initialize a static const map in c++?
#include <map> using namespace std; struct A{ static map<int,int> create_map() { map< ...
- static const readonly
C#中的static 和Java中的static 简单,两者用法完全是一致的.从两方面讨论: 1. 变量是属于类的,不是实例级别的.只能通过类名调用,不能通过实例调用. 2. 如果在定义时就赋值了,那 ...
随机推荐
- LeetCode:打印零与奇偶数【1116】
LeetCode:打印零与奇偶数[1116] 题目描述 假设有这么一个类: class ZeroEvenOdd { public ZeroEvenOdd(int n) { ... } // 构造函数 ...
- Navicat Premium教程
介绍 Navicat premium是一款数据库管理工具,是一个可多重连线资料库的管理工具,它可以让你以单一程式同时连线到 MySQL.SQLite.Oracle 及 PostgreSQL 资料库,让 ...
- git的使用学习(二)git的操作使用
1.创建版本库 什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都 ...
- Spring切面编程AOP
- 说说Spring XML的头
部分内容截取自(http://blog.csdn.net/zhch152/article/details/8191377,http://iswift.iteye.com/blog/1657537) 在 ...
- linux下查看进程的状态 /proc/[pid]/status
查看进程的状态: 1.查看进程的pid,以java为例:ps -ef | grep java 2.查看进程状态:cat /proc/[pid]/status 关键字: linux [root@loca ...
- Image Perimeters
Description 给出一张由"x"和"."组成的矩阵.每个"x"可以向上下左右及两个斜对角进行连通,请问由某个点开始的"x& ...
- 哈希--Hash,“散列”/“哈希”
哈希 Hash,翻译“散列”,音译为“哈希”,把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是散列值的空间通常远小于输入的空间,不同的输入可能会散 ...
- Nginx07---反向代理
小程序使用nginx反向代理https和wss user www www; worker_processes auto; error_log /www/wwwlogs/nginx_error.log ...
- 多线程(8) — ThreadLocal
ThreadLocal是一个线程的局部变量,也就是只有当前线程可以访问,是线程安全的.为每一个线程分配不同的对象,需要在应用层面保证ThreadLocal只起到简单的容器作用. ThreadLocal ...