static 成员函数

和静态数据成员一样,静态成员函数是所有对象共享的,不是单独属于某一个对象,由于静态成员函数没有传递this指针,故static member function 只能访问static成员,不能访问非static 成员。但是非static却可以访问static 成员。

 1 #include<iostream>
 2 using namespace std;
 3 class X{
 4     int i;
 5     static int j;
 6 public:
 7     X(int ii=0) :i(ii){
 8         j = i;//non-static member function can access static member function or data
 9     }
10     int val()const{ return i; }
11     static int incr(){
12         //i++; Error:static member function can not access non-static member data
13         return ++j;
14     }
15     static int f(){
16         //!val()    Error:static member function can not access non-static member function
17         return incr();
18     }
19
20 };
21 int X::j = 0;
22 int main(){
23     X x;
24     X* xp = &x;
25     x.f();
26     xp->f();
27     X::f();
28     system("pause");
29     return 0;
30
31 }

对象在访问静态成员时,可以通过点运算符和箭头运算符。这样就把静态成员函数与某一个对象相连接了,也可以直接用  className::static member fucntion name 的方式访问。

有时可以把构造函数设置成私有的,如下面的例子

 1 class Egg{
 2     static Egg e;
 3     int i;
 4     Egg(int ii) :i(ii){}
 5     Egg(const Egg&);//prevent copy-construction
 6 public:
 7     static Egg* instance(){ return &e; }
 8     int val()const{ return i; }
 9 };
10
11 Egg Egg::e(47);
12 int main(){
13     //! Egg x(0); Error can‘t create an Egg
14     cout << Egg::instance()->val() << endl;
15     system("pause");
16     return 0;
17
18 }

为了不让类可以拷贝创建对象,增加了一个私有的拷贝构造函数

Egg(const Egg&);//prevent copy-construction这样类就不可以如下的创建对象了Egg e=*Egg::instance();
时间: 2024-10-25 21:04:44

static 成员函数的相关文章

static成员函数不能调用non-static成员函数

1 一般类静态成员函数不能调用非静态成员函数 2 static成员函数可以调用构造函数吗? 答案是肯定的,由于static成员函数没有this指针,所以一般static成员函数是不能访问non-static成员的,包括成员函数和成员变量. 由于构造函数特殊性,它从无到有构造一个对象,因此调用它不需要一个instance,也就是不需要this指针来调用,所以在static 函数中能调用构造函数.o 构造函数分成两个阶段:    1. 分配内存:这是从无到有阶段,该阶段结束,产生一个instance

Java继承类中static成员函数的重写

在java中,static成员函数是否可以被重写呢? 结论是,你可以在子类中重写一个static函数,但是这个函数并不能像正常的非static函数那样运行. 也就是说,虽然你可以定义一个重写函数,但是该函数没有多态特性.让我们测试一下: 1 class testClass1{ 2 static void SMothod(){ 3 System.out.println("static in testClass1"); 4 } 5 } 6 class testClass2 extends

Static成员变量,static成员函数解析

最近看Effective C++经常看到一些和static相关的内容,希望综合整理一下,如果有不全,还望补充: 1 类中的Static成员变量 static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联! 一般为类申请一个对象,是对类中成员变量申请一个副本,各个对象之间的成员变量和函数互不影响,但是static成员变量不是在栈空间而是在静态存储区,所有的类对象共享static变量.静态成员是可以独立访问的

【编程拾遗】C++的static成员函数与单例模式

static小结 static的引入 static 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性. 函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题:如果想将函数中此变量的值保存至下一次调用时,如何实现? 最容易想到的方法是定义一个全局的变量,但定义为一个全局变量有许多缺点,最明显的缺点是破坏了此变量的访问范围(使得在此函数中定义的变量,不仅仅受此函数控制).而static变量可以保持该变

C++类中的static数据成员,static成员函数

C++类中谈到static,我们可以在类中定义static成员,static成员函数!C++primer里面讲过:static成员它不像普通的数据成员,static数据成员独立于该类的任意对象而存在,每个static数据成员是与类关联的对象,并不与该类的对象相关联!这句话可能比较拗口,其实可以这么理解:每个static数据成员可以看成是类的一个对象,而不与该类定义的对象有任何关系!下面我们就来具体看看类中的static数据成员! 谈到数据成员,我们最先想到的应该是怎么去定义一个static数据成

C++ Primer 学习笔记_22_类与数据抽象(8)--static 成员变量、static 成员函数、类/对象的大小

一.static 每个static数据成员是与类关联的对象,并不与该类的对象相关联!非static数据成员存在于类类型的每个对象中,static数据成员独立该类的任意对象存在. static成员函数没有this形参,它可以直接访问所属类的static成员,但是不能直接使用static成员! 1.static 成员变量 对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量.比如说统计某种类型对象已创建的数量. 如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量,这时可

static成员函数和static 成员变量的作用

static 成员只属于类不属于具体的对象,1.当类的某些属性需要所有对象都能够统一公用一分内存的时候,就可以定于成静态成员变量2.静态成员函数可以直接使用类去调用,所有当需要查看类的静态成员变量属性的时候可以直接通过静态成员函数去调用,而不需要具体对象去调用 3.因为static 成员属于类,而不属于具体的对象,所有static成员函数不能使用this指针 原文地址:http://blog.51cto.com/wenxuehui/2089850

static成员函数和static成员

C++的静态成员是和类关联的,它属于某个类,但是不属于某个特定的对象.静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节省内存. 但是可以通过对象调用静态成员函数,虽然我们一般不会这么做: 1 class Point 2 { 3 public: 4 void init() 5 { 6 } 7 static void output() 8 { 9 } 10 }; 11 12 void main()

C++_static与非static成员(函数)

static与非static成员(函数) <C++ Primer>第4版399页: 对于特定类类型的全体对象而言,访问一个全局对象有时是必要的.然而,全局变量会破坏封装:对象需要支持特定类抽象的实现.如果对象是全局的,一般的用户代码就可以修改这个值. 鉴于此,类可以定义 类静态成员,而不是定义一个可普遍访问的全局对象. 通常,非static数据成员存在于类类型的每个对象中.然而,static数据成员独立于该类的任意对象而存在: 每个static数据成员是与类关联的对象,而不是与该类的对象相关联