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

static与非static成员(函数)

C++ Primer》第4版399页:

对于特定类类型的全体对象而言,访问一个全局对象有时是必要的。然而,全局变量会破坏封装:对象需要支持特定类抽象的实现。如果对象是全局的,一般的用户代码就可以修改这个值。

鉴于此,类可以定义 类静态成员,而不是定义一个可普遍访问的全局对象。

通常,非static数据成员存在于类类型的每个对象中。然而,static数据成员独立于该类的任意对象而存在;

每个static数据成员是与类关联的对象,而不是与该类的对象相关联。

类也可以定义static成员函数。static成员函数没有this形参,它可以直接访问所属类的static成员,但不能直接使用非static成员。

注意:类的非static成员函数是可以直接访问类的static和非static成员,而不用作用域操作符。

使用static成员的优点:

(1)避免命名冲突:static成员的名字在类的作用域中,因此可以避免与其他类的成员或全局对象名字冲突。

(2)可以实施封装:static成员可以是私有成员,而全局对象不可以。

(3)易读性:static成员是与特定类关联的,可显示程序员的意图。

static成员 与 非static成员调用方法:

非static成员通过对象调用。

static成员通过作用域操作符(直接调用)、对象、引用、指向该类类型对象的指针(间接调用)

class Lunais{

static double zty();

double zzz;

};

Lunais z;

Lunais *t = &z;

double zty;

zty = Lunais::zty();  //static成员通过作用域操作符(直接调用)

zty = z.zty();    //static成员通过对象(简接调用)

zty = t->zty();   //static成员通过指向该类类型对象的指针(简接调用)

static数据成员定义:

1、一般情况下,static数据成员是类内声明,类外定义;

2、static成员不通过类构造函数初始化,而是在定义时进行初始化;

3、一个例外:初始化式为常量表达式,整型static const 数据成员(static const int) 可以在类的定义体内进行初始化:

 

class Lunais{

static const int zty = 30;

}

值得注意的是:const static数据成员在类的定义体中出始化时,该数据成员仍必须在类的定义体外定义,只是不再指定初始值:

const int Lunais::zty;

常实型 static const数据成员不可在类内初始化。一个好的解决方法是使用宏定义: #define zty 5421.5421

###########################################

以下引自:  http://blog.csdn.net/ljfeng123/article/details/20855515

###########################################

常整型静态数据成员可以在类中直接初始化,而常实型静态数据成员不可以

class circle

{

int a;                        // 普通变量,不能在类中初始化

static int b;                   // 静态变量,不能在类中初始化

static const int c=2;               // 静态常整型变量,可以在类中初始化

static const double PI=3.1416;//error C2864:    //只有静态常量整型数据成员才可以在类中初始化

} ;

const int cicle::c ;  //const static数据成员在类的定义体中出始化时,该数据成员仍必须在类的定义体外定义,只是不再指定初始值

b可以在类外进行初始化,且所有对象共享一个b的值:

int circle::b = 2;

double circle::PI = 3.1416;

时间: 2024-10-21 22:37:27

C++_static与非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变量可以保持该变

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

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 成员变量 对于特定类型的全体对象而言,有时候可能需要访问一个全局的变量.比如说统计某种类型对象已创建的数量. 如果我们用全局变量会破坏数据的封装,一般的用户代码都可以修改这个全局变量,这时可

【ThinkingInC++】45、比较const和非const成员函数的例子

/** * 书本:[ThinkingInC++] * 功能:旧代码中的enum hack * 时间:2014年9月10日08:35:13 * 作者:cutter_point */ #include<iostream> #include<ctime> #include<cstdlib> using namespace std; class Bunch { enum {size=1000}; int i[size]; }; int main() { cout<<

java static成员变量方法和非static成员变量方法的区别

这里的普通方法和成员变量是指,非静态方法和非静态成员变量首先static是静态的意思,是修饰符,可以被用来修饰变量或者方法. static成员变量有全局变量的作用       非static成员变量则没有全局变量的作用        局部变量是类的方法里面的变量静态static成员变量是指类的成员变量,他不属于类的对象,只单独属于类,被所有对象共享.当在类中改变他的值时,他在每个对象里面的值都会随之改变. 这也就是说在对象中不能改变他的值,只能在他所在的类中改变,如果他带有final的话(sta