精华内容
下载资源
问答
  • C++ 静态数据成员

    千次阅读 2018-08-21 22:59:45
    类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中(而是在相应的cpp文件中)。 ...

    一. 定义和性质

    1. 定义

    • 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。
    • 静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中(而是在相应的cpp文件中)。
    //xxx.h文件
    
    class base{   
    private:   
        static const int _i;//声明,标准c++支持有序类型在类体中初始化,但vc6不支持。
    };  
    
    
    //xxx.cpp文件
    
    const int base::_i=10; // 定义(初始化)时不受private和protected访问限制  
    

     

    2. 性质

    • 和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。
    • C++静态数据成员被类的所有对象所共享,包括该类派生类的对象。即派生类对象与基类对象共享基类的静态数据成员。

     

    • C++静态数据成员可以成为成员函数的可选参数,而普通数据成员则不可以。
    class base{   
    public :   
        static int _staticVar;   
        int _var;   
        void foo1(int i=_staticVar);//正确,_staticVar为静态数据成员   
        void foo2(int i=_var);//错误,_var为普通数据成员   
    };  
    
    • C++静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。
    class base{   
    public :   
        static base _object1;//正确,静态数据成员
        base _object2;//错误   
        base *pObject;//正确,指针
        base &mObject;//正确,引用
    };  

     

    二. 为什么需要静态数据成员

    不像全局变量,静态数据成员/成员函数保存了类的封装性。静态数据成员/成员函数相关于类,与对象的存毁无关。

    通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。

    但有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。

    静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。

     

    参考文章:

    C++静态数据成员定义及应用浅谈

    C++静态数据成员存在的意义

    展开全文
  • C++静态数据成员的继承

    千次阅读 2019-05-09 13:51:11
    C++静态数据成员的继承基类及其所有子类共用该基类的同一个静态成员变量测试代码:TestStatic.h:main.cpp: 基类及其所有子类共用该基类的同一个静态成员变量 真正理解:静态成员从属于类 测试代码: TestStatic.h...

    基类及其所有子类共用该基类的同一个静态成员变量

    真正理解:静态成员从属于类

    测试代码:

    TestStatic.h:

    class TestStatic
    {
    public:
    	static int y;
    };
    class TestStaticChild :
    	public TestStatic
    {
    };
    class TestStaticChild2 :
    	public TestStatic
    {
    };
    

    main.cpp:

    #include "TestStatic.h"
    #include <iostream>
    using namespace std;
    int TestStatic::y = 10;
    int main() {
    	TestStatic test;
    	TestStaticChild test1;
    	TestStaticChild2 test2;
    	TestStatic::y = 1;
    	cout << test.y << endl;
    	TestStaticChild::y = 2;
    	cout << test1.y << endl;
    	TestStaticChild2::y = 3;
    	cout << test2.y << endl << endl;
    	cout << test.y << endl;
    	cout << test1.y << endl;
    	cout << test2.y << endl;
    	system("pause");
    	return 0;
    }
    
    展开全文
  • C++ 静态数据成员与静态成员函数

    千次阅读 2017-05-12 14:40:11
    在类中的数据成员或成员函数定义或声明前以static关键词开头,即构成静态数据成员与静态成员函数。静态数据成员1.静态数据成员的实现class Time { public : void showtime();...2.静态数据成员的意义C++

    在类中的数据成员或成员函数定义或声明前以static关键词开头,即构成静态数据成员与静态成员函数。

    静态数据成员

    1.静态数据成员的实现

    class Time
    {
    public :
    	void showtime();
    private:
    	static int hour; //定义hour为静态数据成员
    	int minute;
    	int sec;
    };
    

    2.静态数据成员的意义

    C++为什么要进入静态数据成员这个概念,或者它有什么好处。
    静态数据成员可以实现一个类中不同对象的某个数据的值是一样的。比如一个类中包含的数据成员有:班级,姓名,学号,性别。那么对于一个班的几个同学,班级的值一定是一样的。假设每一个学生就是一个对象,那么不同的对象的数据中,班级这个数据就是一样的。
    所以这也就是静态的数据成员的意义,当班级的数据前加上static关键字后,班级被定义为静态数据成员,当这个值改变时,该类实例化出的每一个对象的班级数据全部随之改变。

    3.静态数据成员的特性

    (1)静态数据成员的属性:
    静态数据成员属于类,而不属于某一个对象。

    (2)静态数据成员的初始化:
    静态数据成员在类内定义,而不能在类内完成初始化,直接赋值和利用构造函数初始化都不可以。我是这样理解这个特性的:

    //直接赋值完成初始化
    class Time
    {
    public :
    	void showtime();
    private:
    	static int hour = 0;
    	int minute;
    	int sec;
    };
    

    这个很好理解,这显然是错的,因为只有静态常量才能在类内完成初试化,要改成这样才可以static const int hour = 0;但是如果写成这样,该数据成员将无法改变,显然我们并不希望如此。

    //利用构造函数初始化静态数据成员
    class Time
    {
    public :
    	Time()
    	{
    		hour = 0;
    		minute = 0;
    		sec = 0;
    	}
    	void showtime();
    private:
    	static int hour;
    	int minute;
    	int sec;
    };
    

    利用构造函数初始化静态数据成员,**这也是错的。**我们可以这样理解这件事,在构造函数的博客里提到:类中的构造函数在实例化对象时被系统调用,然后实现对成员数据的赋值工作,显然这些数据成员属于对象。而静态数据成员属于类,不属于任何一个对象。

    那么应该如何完成静态数据成员的初始化:静态数据成员的初始化只能在类体外完成。

    class Time
    {
    public :
    	void showtime();
    private:
    	static  int hour ;
    	int minute;
    	int sec;
    };
     int Time::hour= 10;
    

    **这是正确的方式!!**看着很奇怪有没有!!没有对象,直接用类名引用成员,这也恰恰说明了静态数据成员不属于任何对象,而属于类本身。

    (3)静态数据成员的引用:
    从(2)中已经看到了,可以直接用类名来引用静态数据成员。同时也可以通过对象来引用,这是因为虽然静态数据成员不属于某一个对象而是属于类,但是对象属于类,所有也就可以应用对象来引用静态数据成员。

    4.静态数据成员的应用

    #include <iostream>
    using namespace std;
    
    class Time
    {
    public :
    	Time(int,int);
    	void showtime();
    private:
    	static  int hour ;
    	int minute;
    	int sec;
    };
    Time::Time(int m,int s)
    {
    	minute = m;
    	sec = s;
    }
     int Time::hour= 10;
    void Time::showtime()
    {
    	cout<<"hour:"<<hour<<endl<<"min:"<<minute<<endl<<"sec:"<<sec<<endl;
    }
    int main()
    {
    	Time time1(2,3);
    	time1.showtime();
    	Time time2(4,5);
        time2.showtime();
    	getchar();
    	return 0; 
    }
    

    运行结果:
    hour:10
    minute:2
    sec:3
    hour:10
    minute:4
    sec:5

    可以看到:两个对象的hour成员都是10。

    静态成员函数

    和静态数据成员类似,静态成员函数一样也是在前面加入static关键字。
    1.静态成员函数的实现

    class Time
    {
    public :
    	static void showtimeh();//定义showtimeh()为静态成员函数
    	void showtime();
    private:
    	static int hour; //定义hour为静态数据成员
    	int minute;
    	int sec;
    };
    

    2.静态成员函数的意义

    静态成员函数可以使一切不需要实例化就可以有确定行为方式的函数使用起来更加方便,比如某些通用算法。由于静态成员函数只能访问本类中的静态数据成员,而无法访问非静态数据成员,这样使程序设计更加清晰。

    3.静态数据成员的特性

    (1)静态成员函数的属性:
    静态成员函数属于类,而不属于某一个对象。

    (2)静态成员函数的访问:
    静态成员函数只能访问本类中的静态数据成员
    非静态成员函数可以访问本类中的静态数据成员非静态数据成员
    4.静态数据成员的应用

    #include <iostream>
    using namespace std;
    
    class Time
    {
    public :
    	Time(int,int);
    	static void showtimeh();
    	 void showtime();
    private:
    	static  int hour ;
    	int minute;
    	int sec;
    };
    Time::Time(int m,int s)
    {
    	minute = m;
    	sec = s;
    }
     int Time::hour= 10;
    void Time::showtime()
    {
    	cout<<"hour:"<<hour<<endl<<"min:"<<minute<<endl<<"sec:"<<sec<<endl;
    }
    void Time::showtimeh()
    {
    	cout<<"hour:"<<hour<<endl;
    }
    int main()
    {
    	Time time1(2,3);
    	time1.showtime();
        Time::showtimeh();
    	getchar();
    	return 0; 
    }
    

    运行结果:
    hour:10
    minute:2
    sec:3
    hour:10

    展开全文
  • 1.定义静态数据成员后要对静态数据成员进行初始化! 静态数据成员的初始化: <数据类型><类名>::静态数据成员 = <值> 2.静态数据成员往往数私有的,静态数据成员不能直接访问,要通过定义为公有...

    1.定义静态数据成员后要对静态数据成员进行初始化!
    静态数据成员的初始化:
    <数据类型><类名>::静态数据成员 = <值>

    2.静态数据成员往往数私有的,静态数据成员不能直接访问,要通过定义为公有的静态函数成员来访问静态数据成员。

    3.静态函数成员接口实现时在前面不加 static 前缀。

    4.静态函数成员,不能直接访问非静态数据成员,除非通过对象名来访问该对象的非静态数据成员。

    部分代码描述:
    定义货物类,私有成员有货物重量,货物总重量(静态数据成员),初始化静态数据成员。
    static int gettotalweight();不能直接访问 weight

    #include <iostream>
    using namespace std;
    
    class Tgoods{
    private:
    	int weight;
    	static int totalweight;
    public:
    	Tgoods(int w);
    	~Tgoods();
    	int getweight();
    	static int gettotalweight();
    };
    
    //△<数据类型><类名>::<静态数据成员名>=<值>
    int Tgoods::totalweight = 0;
    
    Tgoods::Tgoods(int w){
    	weight = w;
    	totalweight += weight; 
    }
    
    Tgoods::~Tgoods(){
    	totalweight -= weight;
    }
    
    Tgoods::getweight(){
    	return weight;
    }
    
    int Tgoods::gettotalweight(){
    	return totalweight;
    }
    
    int main()
    {
    	Tgoods goods1(20), goods2(30);
    
    	cout<< Tgoods::gettotalweight() <<endl;
    
    	//getchar();
    	
    	return 0;
    }
    
    
    
    展开全文
  • C++静态数据成员实现

    2017-07-11 11:45:27
    静态数据成员是在一个类中用关键字static声明的数据成员。在C++中,一般使用静态成员来代替C语言的全局变量,以达到数据共享。C和C++的全局变量有一定的局限性,可以任意被修改,也容易和其它的变量名冲突,故在C++...
  • C++静态数据成员和静态成员函数

    千次阅读 2006-09-02 21:35:00
    C++静态数据成员和静态成员函数作者:李英江作者网站: http://www.cgsir.com  总结了一下今天复习的 C++静态数据成员和静态成员函数。 由于近来在开发3ds Max 插件时,非常多的地方要使用到类静态数据成员和静态...
  • 静态数据成员 1.为什么我们需要使用静态数据成员?  我们知道每一个对象都有自己独有的数据成员的值,那怎么去实现不同对象之间可以去共享数据呢?于是就有了两种的方法:一个是全局变量,但是由于全局变量也...
  • C++静态数据成员定义及应用浅谈

    千次阅读 2012-08-24 14:23:10
    类体中的数据成员的声明前加上static...1.C++静态数据成员的定义。  静态数据成员实际上是类域中的全局变量。所以,静态数据成员的定义(初始化)不应该被放在头文件中。 其定义方式与全局变量相同。举例如下
  • 因为静态数据成员可以为类中的其它数据成员或函数成员所用,所以考虑到一个数组如果用静态成员作为维数的话,则应该让该成员被常量表达式初始化,所以C++允许常量整型的静态成员在类体中被初始化,而其它类型一律不允许....
  • C++静态数据成员的引用

    千次阅读 2017-03-04 22:51:24
    静态数据成员可以初始化,但只能在类体外进行初始化 如: Int Box::height=10; 不能够使用参数初始化列表对静态数据成员进行初始化。#include <iostream>using namespace std;class Box{ public: Box(int,int); ...
  • C语言中的static变量和C++静态数据成员(static member)__生命周期,作用域,访问约束等__静态成员的初始化不应该在头文件中,静态数据成员被类的所有对象共享、包括派生类的对象,在类中可以声明所属类自己的静态数据...
  • c++ 静态数据成员和静态成员函数

    千次阅读 2011-05-19 11:13:00
    1 静态数据成员 要定义静态数据成员,只要在数据成员的定义前增加static关键字。静态数据成员不同于非静态的数据成员,一个类的静态数据成员仅创建和初始化一次,且在程序开始执行的时候创建,然后被该类的所有对象...
  • C++ 静态数据成员使用

    千次阅读 2014-03-01 15:25:54
    static关键字定义静态数据成员 引用静态数据成员的格式:  类名::静态数据成员 #include using namespace std; class MyClass { private: int n; public: static int s;//静态数据成员定义 void add(){ s+...
  • C语言中的static变量和C++静态数据成员(static member)__生命周期,作用域,访问约束等__静态成员的初始化不应该在头文件中,静态数据成员被类的所有对象共享、包括派生类的对象,在类中可以声明所属类自己的静态数据...
  • 静态类成员包括静态数据成员和静态函数成员两部分。 一、 静态数据成员:  类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/...
  • C语言中的static变量和C++静态数据成员(static member)__生命周期,作用域,访问约束等__静态成员的初始化不应该在头文件中,静态数据成员被类的所有对象共享、包括派生类的对象,在类中可以声明所属类自己的静态数据...
  • 程序员面试秘笈一书中 169页刚说可以用private隐藏信息 ,又在173就说private 控制不了静态数据成员。 那么到底能不能控制? 我的答案是:可以隐藏信息(禁止获取或修改),但是控制不了(还可以初始化) 1、private...
  • 类的静态成员变量和函数中的静态变量一样,在编译的时候就分配内存了,直到程序退出才释放,并不是随着对象的删除而释放的: 类的静态成员变量为什么必须得在类外初始化? 我的理解: 由于静态变量在编译期间必须初始...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 137,410
精华内容 54,964
关键字:

c++静态数据成员

c++ 订阅