【C/C++语法外功】类的静态成员理解
例1 孙鑫視頻學習 Oct.27th 2009 Skyseraph
例子1.0
#include "iostream"
class Point
{
public:
void output() {}
static void init() {} //静态函数,不属于某个具体的对象,即在未产生Point任何对象时,这个类已经存在于程序的代码区
}
void main()
{
/*法一
Point pt; //构造对象
pt.init();
pt.output();
*/
//法二
Point::init();/
Point::output();//错误
}
说明:法一正确;法二执行错误,原因:
//静态成员函数和静态成员变量属于类本身,在类加载的时候,即为它们分配了空间,故可以用类名::函数名或类名:变量名来访问;
//而非静态成员函数和非静态成员属于对象的方法和数据,也就是应该先产生类的对象,然后通过类的对象去引用。
修改1.1:
class Point
{
public:
void output() {}
static void init() {x=0;y=0;}
private:
int x,y;
}
void main()
{ Point::init();//错误:在静态成员函数中不能调用非静态成员
}
说明:在静态成员函数中不能调用非静态成员(静态成员函数和静态成员变量);反之在非静态成员函数中可以调用静态成员,可以在修改void output(){ init(); };检验
内存模型:无论采取什么样的操作,程序代码都是在内存中执行的,只有在内存中占有一席之地,我们才能访问它。
修改1.2
在int x,y;前加static,编译无错,链接时出错
说明:对于静态成员变量,必须对其进行初始化,且必须在类外进行此操作
加上:int Point::x=0;int Point::y=0; OK!
例2 自编小程序 再次理解static Oct28th 2010 skyseraph
#include "iostream"
using namespace std;
class point
{
public:
void point::output1()
{
x1 =0;
x2 =0; //知识点7:非静态成员函数中可以调用静态数据成员
cout<<"I am not a static member function!"<<endl;
}
static void output2()
{
//y1 =0; //知识点6:静态成员函数中不可以调用非静态数据成员
//y2 =0; //知识点2:静态数据成员必须初始化,且必须在类外初始化
cout<<"I am a static member function"<<endl;
}
//void output3(int data=x1) {} //知识点5:静态数据成员可以作为成员函数的默认参数,而非静态成员函数不可以
void output4(int data=x2){}
//static void output() const; //知识点9:静态成员函数不能使用const关键字
//point a1;
static point a2; //知识点4:在定义类成员时,静态数据成员允许定义类的所属对象,非静态数据成员只能是当前类的指针或引用类型
point *a3;
public:
int y1; //y1=0 基础:不能直接对类的数据成员初始化
static int y2;
private:
int x1;
static x2;
};
int point::x2=1; //知识点2:静态数据成员必须初始化,且必须在类外初始化
int point::y2=1;
/* //问题:加上这段,编译始终不能通过,不知什么地方出现了问题,待议~
void output2() //基础:对于方法/类的成员函数 的定义可以放在类中或者类外
//知识点8:在定义静态成员函数时,如果是在类外实现,那么不能再加static关键字
{
//y1 =0; //知识点6:静态成员函数中不可以调用非静态数据成员
//y2 =0; //知识点2:静态数据成员必须初始化,且必须在类外初始化
cout<<"I am a static member function"<<endl;
}*/
int main(char argc,char** argv)
{
cout<<"通过对象访问"<<endl;
point a,b;
a.output1();
a.output2();
point*c; //基础: 待议~~
c->output1();
c->output2();
cout<<"通过类名直接访问"<<endl;
//point::output1(); //知识点1:静态成员用类名或对象访问,非静态成员用对象访问 //错误
point::output2();
//cout<<a.x1<<endl; //基础:访问私有类 //错误
cout<<a.y2<<endl; //知识点3:类的静态数据成员被所有类的对象共享
//cout<<b.x1<<endl;
cout<<b.y2<<endl;
return -1;
}
【C/C++语法外功】类的静态成员理解的更多相关文章
- 面向对象课后深入学习(C++ 类的静态成员详细讲解)
今天在刚申请了博客,一下午都在写那个随笔,所以说好的来看c++的也放在了最后,下星期就考试了,这个类的静态成员是我不是很懂的,在网上 看到一片很详细的博客考下来回去慢慢看. 在C++中,静态成员是属于 ...
- C++ 类的静态成员详细讲解
在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节 ...
- C++ 类的静态成员详细讲解(转)
在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节 ...
- C++@类的静态成员变量和静态成员函数
参考: http://blog.csdn.net/morewindows/article/details/6721430 http://www.cnblogs.com/lzjsky/archive/2 ...
- C++ 类的静态成员详细讲解[转]
在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节 ...
- 转:C++ 类的静态成员详细讲解
在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节 ...
- 05-- C++ 类的静态成员详细讲解
C++ 类的静态成员详细讲解 在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不 ...
- python中元类(metaclass)的理解
原文地址:http://www.cnblogs.com/tkqasn/p/6524879.html 一:类也是对象 类就是一组用来描述如何生成一个对象的代码. 类也是一个对象,只要你使用关键字clas ...
- C++类的静态成员详解
类的静态成员分为静态数据成员和静态成员函数 静态数据成员 假如我们要设计一个战争游戏,游戏中有许多的兵种.游戏的过程中,每隔一段时间每个兵种都会产生,同时由于战争的消耗,每个兵种士兵的数量又会减少.为 ...
随机推荐
- PAT (Basic Level) Practice 1008 数组元素循环右移问题
个人练习 一个数组A中存有N(>)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥)个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN ...
- Lingo基本操作
目录 Lingo基本操作 前言 一.Lingo基本运算符 1.1 算术运算符 1.2 逻辑运算符 1.3 关系运算符 二.函数 2.1 标准数学函数 2.2 集循环函数 三.待更新 Lingo基本操作 ...
- Java设计模式(15)——行为模式之策略模式(Strategy)
一.概述 概念 UML简图 角色 二.实践 我们先将上述的UML图的抽象情况下的代码写出,然后再给出一个具体的例子 策略接口——当然如果有一些公共的行为,应当使用抽象类! /** * 策略接口 * * ...
- 武汉Uber优步司机奖励政策
·武汉奖励前提 *必须满足当周平均评分4.7星及以上,且当周接单率70%及以上,才有资格获得奖励 *刷单和红线行为立即封号并取消当周全部奖励及车费! *从4月20日起,所有ETC和机场高速费用不参与奖 ...
- 低于0.01%的极致Crash率是怎么做到的?
WeTest 导读 看似系统Bug的Crash 99%都不是系统问题!本文将与你一起探索Crash分析的科学方法. 在移动互联网闯荡多年的iOS手机管家,经过不断迭代创新,已经涵盖了隐私(加密相册). ...
- create-react-app创建react项目 css模块化处理
用的css预处理器用sass,其他大同小异. 用create-react-app创建项目,执行npm run eject弹出配置文件(此操作不可逆): 配置sass,用的最新的CRA,webpack4 ...
- selenium自动化一点记录
UI自动化 1.webdriver的findElement方法可以查找页面某元素,通常使用方式是通过id和name进行查找 1.By ID根据id进行定位 WebElement element=dri ...
- 第六阶段·数据库MySQL及NoSQL实践 第2章·Redis
01-Redis简介 02-Redis基本安装启动 03-Redis的配置文件基本使用 04-Redis安全管理 05-Redis安全持久化-RDB持久化 06-Redis安全持久化-AOF持久化 0 ...
- Python 作用域和命名空间
在介绍类之前,我首先要告诉你一些Python的作用域规则.类定义对命名空间有一些巧妙的技巧,你需要知道作用域和命名空间如何工作才能完全理解正在发生的事情.顺便说一下,关于这个主题的知识对任何高级Pyt ...
- docker创建redis镜像
pull redis 镜像 创建redis的镜像有几种方式,可以直接从仓库中拉取,也可以采用dockerfile文件自己编译创建. 基于已有的redis镜像,docker可以采用run,或者creat ...