单实例中对静态成员函数及变量的回顾

  1. 程序最终都将在内存中执行,变量只有在内存中占有一席之地时才有被访问的可能,除此之外,还要有相应的权限。
  2. 静态成员函数和非静态成员函数的一个重大区别是,静态成员函数不接受隐含的this指针,它是属于类的,是公有的,因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员;非静态成员函数带有隐含的this指针,它是属于对象的。
  3. 类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,存储在静态存储区,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,存储在栈区,可通过类的对象(实例)去访问。
  4. 在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员要等对象实例化之后才会存在,此时可能会访问一个内存中不存在的东西,因此会出错;
  5. 此外,即使此时对象已经实例化,非静态成员已经存在,静态成员函数依然不能访问非静态成员,这就是权限问题,如果一定要访问,可通过对象参数进行传递。

由上可知:使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取

更新后的相同的值,这样可以提高时间效率。

静态数据成员的使用方法和注意事项如下:

1、静态数据成员在定义或说明时前面加关键字static。

2、静态成员初始化与一般数据成员初始化不同。静态数据成员初始化的格式如下:
     <数据类型><类名>::<静态数据成员名>=<值>

这表明:
(1) 初始化在类体外进行,而前面不加static,以免与一般静态变量或对象相混淆。

(2) 初始化时不加该成员的访问权限控制符private,public等。

(3) 初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。

3、静态数据成员是静态存储的,它是静态生存期,必须对它进行初始化。

4、引用静态数据成员时,采用如下格式:

<类名>::<静态成员名>

静态成员函数

静态成员函数和静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。因此,对静态成员的引用不需要用对象名。

在静态成员函数的实现中不能直接引用类中说明的非静态成员,可以引用类中说明的静态成员。如果静态成员函数中要引用非静态成员时,可通过对象来引用。下面通过例子来说明这一点。

#include <iostream>

using namespace std;

class M

{

public:

M(int a) { A=a; B+=a;}

static void f1(M m);

private:

int A;

static int B;

};

void M::f1(M m)

{

cout<<"A="<<m.A<<endl; //静态成员函数中通过对象来引用非静态成员

cout<<"B="<<B<<endl;

}

int M::B=0; //静态数据成员初始化的格式<数据类型><类名>::<静态数据成员名>=<值>

void main()

{

M P(5),Q(10);

M::f1(P); //静态成员函数调用时不用对象名

M::f1(Q);

}

读者可以自行分析其结果。从中可看出,调用静态成员函数使用如下格式:

<类名>::<静态成员函数名>(<参数表>);

运行结果:

A=5

B=15

A=10

B=15

时间: 2024-08-25 23:14:32

单实例中对静态成员函数及变量的回顾的相关文章

【C/C++学院】0819-/类的成员函数与const-mutable /构造与析构/拷贝构造deletedefault以及深浅拷贝/静态成员函数成员变量类在内存的存储默认参数/友元类以及友元函数

类的成员函数与const-mutable 成员函数 Fushu.h #pragma once #include <iostream> class fushu { public: int x; int y; public: fushu(); ~fushu(); void show(); inline void showall(int x, int y);//显式内联 void setxy(int x, int y);//编译器优化,默认隐式内联 void show(int x, int y);

Java反射机制可以动态修改实例中final修饰的成员变量吗?

问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. 2. 当final修饰的成员变量在定义的时候并没有初始化值的话,那么就还能通过java反射机制来动态修改它的值. 实验: 1. 当final修饰的成员变量在定义的时候就初始化了值 1 public Class Person { 2 private final String name = "damon

vue实例中的render函数

在runtime-only的vue版本中使用的就是render函数,运行依赖的一般都是runtime-omly的vue,compile版本占的体积太大不适合用作运行版本.因为缺少编译器,浏览器不能直接识别.vue文件,因此在开发时会把vue相关的代码编译成浏览器识别的js,在浏览器运行时便只需要,只用来运行的runtime-only版vuejs即可. 原文地址:https://www.cnblogs.com/chujunqiao/p/11624338.html

[email&#160;protected]类的静态成员变量和静态成员函数

参考: http://blog.csdn.net/morewindows/article/details/6721430 http://www.cnblogs.com/lzjsky/archive/2011/01/24/1943199.html 分析Qt程序时,碰到下面代码. QString str = QString("QFrame#avatar{border-image:url(%1.jpg)}").arg( QString::number(i) );   静态成员变量 静态成员函

C++学习10 static静态成员变量和静态成员函数

一般情况下,如果有N个同类的对象,那么每一个对象都分别有自己的成员变量,不同对象的成员变量各自有值,互不相干.但是有时我们希望有某一个或几个成员变量为所有对象共有,这样可以实现数据共享. 可以使用全局变量来达到共享数据的目的.例如在一个程序文件中有多个函数,每一个函数都可以改变全局变量的值,全局变量的值为各函数共享.但是用全局变量的安全性得不到保证,由于在各处都可以自由地修改全局变量的值,很有可能偶然失误,全局变量的值就被修改,导致程序的失败.因此在实际开发中很少使用全局变量. 如果想在同类的多

C++之类的静态成员变量和静态成员函数

static静态成员函数 在类中.static 除了声明静态成员变量,还能够声明静态成员函数. 普通成员函数能够訪问全部成员变量.而静态成员函数仅仅能訪问静态成员变量. 我们知道.当调用一个对象的成员函数(非静态成员函数)时,系统会把当前对象的起始地址赋给 this 指针.而静态成员函数并不属于某一对象.它与不论什么对象都无关,因此静态成员函数没有 this 指针.既然它没有指向某一对象,就无法对该对象中的非静态成员进行訪问. 能够说.静态成员函数与非静态成员函数的根本差别是:非静态成员函数有

静态成员函数为什么不能访问本类中的非静态成员?

和静态数据成员一样,静态成员函数是类的一部分,而不是对象的一部分.如果要在类外调用公用的静态成员函数,要用类名和域运算符"∷".如Box∷volume( );实际上也允许通过对象名调用静态成员函数,如a.volume( );但这并不意味着此函数是属于对象a的,而只是用a的类型而已.静态成员函数的作用是为了能处理静态数据成员.可以说,静态成员函数与非静态成员函数的根本区别是:非静态成员函数有this指针,静态成员函数并不属于某一对象,它与任何对象都无关,静态成员函数没有this指针.由此

C++静态成员函数和静态数据成员

当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享.各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关.静态方法就是与该类相关的,是类的一种行为,而不是与该类的实例对象相关. 静态数据成员的用途之一是统计有多少个对象实际存在. 静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的.也不能在类的构造函数中初始化该成员,因为静态数据成员为类的各个对象共享,否则每次创建一

对Servlet单实例多线程的理解。

0 Servlet如何处理多个请求访问? Servlet容器默认是采用单实例多线程的方式处理多个请求的: Servlet是单实例多线程运行方式,所以对象变量线程不安全,局部变量线程安全的. 1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例): 2.容器初始化化Servlet主要就是读取配置文件(例如tomcat,可以通过servlet.xml的<Connector>设置线程池中线程数目,初始化线程池通过web.xml,初始