例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++语法外功】类的静态成员理解的更多相关文章

  1. 面向对象课后深入学习(C++ 类的静态成员详细讲解)

    今天在刚申请了博客,一下午都在写那个随笔,所以说好的来看c++的也放在了最后,下星期就考试了,这个类的静态成员是我不是很懂的,在网上 看到一片很详细的博客考下来回去慢慢看. 在C++中,静态成员是属于 ...

  2. C++ 类的静态成员详细讲解

    在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节 ...

  3. C++ 类的静态成员详细讲解(转)

    在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节 ...

  4. C++@类的静态成员变量和静态成员函数

    参考: http://blog.csdn.net/morewindows/article/details/6721430 http://www.cnblogs.com/lzjsky/archive/2 ...

  5. C++ 类的静态成员详细讲解[转]

    在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节 ...

  6. 转:C++ 类的静态成员详细讲解

    在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节 ...

  7. 05-- C++ 类的静态成员详细讲解

     C++ 类的静态成员详细讲解    在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不 ...

  8. python中元类(metaclass)的理解

    原文地址:http://www.cnblogs.com/tkqasn/p/6524879.html 一:类也是对象 类就是一组用来描述如何生成一个对象的代码. 类也是一个对象,只要你使用关键字clas ...

  9. C++类的静态成员详解

    类的静态成员分为静态数据成员和静态成员函数 静态数据成员 假如我们要设计一个战争游戏,游戏中有许多的兵种.游戏的过程中,每隔一段时间每个兵种都会产生,同时由于战争的消耗,每个兵种士兵的数量又会减少.为 ...

随机推荐

  1. Python学习笔记三:数据类型

    数据类型 整数int 32位机器,-2**31~2**31-1,即-2147483648~2147483647(4亿多) 64位机器,-2**63~2**63-1,非常大了. 长整型long 没有位数 ...

  2. go基础语法-循环语句

    1.基础定义 for语句的条件不需要括号(同if语句) ,golang里的循环只有for,没有while sum := 0 for i=0;i<100;i++ { sum += i } 2.条件 ...

  3. [原创]记一次java执行段错误及解决过程

    最近一周左右,网管监控系统经常监控到tomcat异常退出,由于有检测tomcat pid的脚本,所以会自动重启服务器,查询tomcat日志没有报错信息,查询系统message日志,可以看到如下信息. ...

  4. 【BZOJ3611】大工程(虚树,动态规划)

    [BZOJ3611]大工程(虚树,动态规划) 题面 BZOJ Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树 ...

  5. 北京Uber优步司机奖励政策(12月20日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  6. 微服务架构(Microservice Architect Pattern)综述——什么是微服务架构(读书笔记)

    简单定义: 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间相互协调,相互配合,为用户提供最终价值.每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制相互沟通(通 ...

  7. SpringBoot-05:SpringBoot初运行以及tomcat端口号的修改

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 上篇博客讲了,如何创建SpringBoot工程,所以,我本篇博客讲述,如何跑起来自己的第一个案例 1.准备一个 ...

  8. Visual studio 2010 TFS地址解析,让团队资源管理器不再显示IP地址

    第一步: 找到名为hosts的配置文件(路径C:\Windows\System32\drivers\etc\hosts)用记事本打开并写入需要的配置,例如我用到的是TFS服务器的IP地址为192.16 ...

  9. SpringBoot 基于lettuce 连接池 配置redis多数据源操作 生产配置

    添加pom<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons- ...

  10. logback.xml日志文件配置

    放在resources目录下面就可以自动读取<?xml version="1.0" encoding="UTF-8"?> <configura ...