精华内容
下载资源
问答
  • c++静态成员变量初始化
    2021-10-20 17:13:40

    普通静态变量的初始化

    #include<iostream>
    using namespace std;
    int main()
    {
    	static int sa;//普通静态变量
    	//普通静态变量定义时分配内存,系统自动初始化为0
    	cout << sa << endl;
    	return 0;
    }
    

    静态成员变量的初始化

    参考以下文章
    c++静态成员变量的初始化

    #include<iostream>
    using namespace std;
    class A
    {
    public:
    	static int cnt;
    };
    int main()
    {
    	A a;
    	static int sa;//普通静态变量
    	cout << sa << endl;//0
    	cout << A::cnt << endl;
    	cout << sizeof(A) << endl;//1
    	return 0;
    }
    /*
    上述代码会报错,错误	2	error LNK2001: 
    无法解析的外部符号 "public: static int A::cnt" 
    原因是static int cnt只是类内的声明,在类外没有定义,
    即没有分配内存,所以会报错
    */
    

    在类外加上静态数据成员的定义int A::cnt后,程序会通过编译。

    #include<iostream>
    using namespace std;
    class A
    {
    public:
    	static int cnt;
    };
    int A::cnt;//静态数据成员的定义,分配内存,自动初始化为0
    int main()
    {
    	A a;
    	static int sa;//普通静态变量
    	cout << sa << endl;//自动初始化为0
    	cout << A::cnt << endl;//自动初始化为0
    	cout << sizeof(A) << endl;
    	return 0;
    }
    

    总结:

    这里普通静态变量与类的静态成员变量的初始化不同,原因是类的静态数据成员变量只是在类内进行声明,并没有为其分配内存空间,所以在类外必须定义,从而分配空间并初始化。而普通静态变量声明与定义是同时的,不用再另行定义。

    更多相关内容
  • C++静态成员变量初始化

    千次阅读 2021-06-17 10:35:00
    静态成员变量初始化 静态成员变量可以初始化,但只能在类体外进行初始化。如: long long student::number = 13926572996; //在类体外对静态成员变量赋值 其一般形式为: 数据类型 类名::静态成员变量名 = ...

    静态成员变量初始化

           静态成员变量可以初始化,但只能在类体外进行初始化。如:

    long long student::number = 13926572996;    //在类体外对静态成员变量赋值

    其一般形式为:

    数据类型 类名::静态成员变量名 = 初值;

    不必在初始化赋值语句中加 static。

           注意:不可以在构造函数的参数初始化表中对静态成员变量初始化,例如:

        student(char* pn, char* pa, int n):number(n)

        {

            strcpy(name, pn);

            strcpy(addr, pa);

        }

           在构造函数中,对static类型的number成员进行初始化,是错误的操作。

    如果未对静态成员变量赋值,则编译系统会自动赋初值为0。

    如果一个成员变量定义为const类型,同时,也是static类型,那么,应该怎么样初始化?有如下的分析:

    (1) static类型的成员变量,需要在类外进行初始化;

    (2) const类型的成员变量,需要在构造函数的初始化列表进行初始化;

           那么,const类型的static成员变量,不可以在构造函数的初始化列表中进行初始化,例如:

           程序编译错误,如下:

           提示 student::number成员变量是static类型,仅仅在定义的时候可以初始化。所以,不可以在构造函数列表中初始化。所以,在类外对static类型的成员变量进行初始化,程序测试代码如下:

           程序运行结果如下:

           所以,可以在类外对const类型的静态成员变量进行初始化。

           注意:对于const 类型的static成员变量,可以在定义它的时候进行初始化,如下:

           在student类内对number成员进行初始化。这是合法的语句。

    韦凯峰 Linux C/C++ 程序设计教程,Linux 系统编程,Openwrt 系统开发,微信:13926572996,QQ:1523520001,博客:www.mylinux.vip

    展开全文
  • C++静态成员变量初始化和赋值

    万次阅读 2019-03-07 14:29:57
    这里说一下C++静态成员变量,在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的...

    1.背景

    有这样一套会话机制,CSession为会话对象,CSessionManager为会话管理类,在CSession会话需要销毁时,CSession主动发送消息给CSessionManager销毁session。同时CSession是一个基类,子类通过继承CSession实现不同的session处理。

    实现主要考虑三个方面(创建、处理、销毁):

    1. 通过不同的server创建不同的session会话;
    2. 子类通过CSession提供的虚函数接口实现多态;
    3. 通过消息对象指针发送消息给CSessionManager销毁session;

    问题卡在session的销毁:

    CSessionManager通过消息队列模板类创建消息对象,保存消息对象指针信息,并且有一个线程专门接收该对象发送的消息。那么CSession会话类也需要知道和保存消息对象指针。

    先前有类似情况,消息对象指针是通过构造传参保存下来的。但现在CSession作为一个基类(要被继承),显然通过构造传参是非常不合理的,并且我希望CSession只保存一份消息对象指针(static成员变量),提供唯一 一个发送消息的接口给子类。

    大致代码如下:

    typedef struct
    {
    	int connfd;
    	int keepfd;		/*是否保留fd:1-是,其他-否*/
    }SocketSessionExp;
    
    //session会话基类(HttpSession、RtspSession继承该类)
    class CSession
    {
    	friend class CSessionManager;
    	public:
    		CSession();
    		virtual ~CSession();
    	protected:
    		static void sendMessage(SocketSessionExp &expMessage);//希望CSession对象和子类能通过这个唯一接口发送消息给CSessionManager销毁该CSession会话
    	private:
    		static TMessageQue<SocketSessionExp> *m_exception_msq;//TMessageQue为消息队列模板类
    }
    
    //会话管理类
    class CSessionManager
    {
    public:
    	static CSessionManager* instance();		//单健类
    private:
    	CSessionManager();
    	{
    		m_exception_msq = new TMessageQue<SocketSessionExp>();
    		CSession::m_exception_msq=m_exception_msq;
    	}
    	~CSessionManager();//不是重点未给出
    private:
    	static TMessageQue<SocketSessionExp> *m_exception_msq;//在构造函数中new一个类对象
    	std::map<int,CSession*>			m_sessionMap;
    }
    
    

    该模块编译时没报错,链接时报错提示:

    undefined reference to `Network::CSession::m_exception_msq'
    

    2.试错

    CSessionManager是CSession的友元类,可直接访问CSession的私有成员和保护成员。也尝试通过函数、局部CSession等方式来完成m_exception_msq的赋值,均报错。

    3.分析与百度

    class CSession
    {
    	friend class CSessionManager;
    	public:
    		CSession();
    		virtual ~CSession();
    	private:
    		static TMessageQue<SocketSessionExp> *m_exception_msq;//TMessageQue为消息队列模板类
    }
    

    分析-有用信息:

    1. 在如上代码中,m_exception_msq只是声明,并没有定义和初始化。
    2. “undefined reference to”是未定义……;
    3. 项目中有地方使用静态变量的地方都在.cpp文件上方进行了初始化(实际是定义–>初始化)。

    分析推测:应该是m_exception_msq未定义。

    在.cpp文件中添加如下代码:

    //xxx.cpp
    TMessageQue<SocketSessionExp>* CSession::m_exception_msq=NULL;
    

    编译成功、链接成功、通过打印信息也看到CSession::m_exception_msq在CSessionManager构造中完成了赋值,问题解决了。

    这里一方面是对static成员变量的理解不到位,另一方面是分析的时候没有抓住有效信息浪费了不少时间。(“undefined reference to”)

    4.C++静态成员变量

    C++的变量的类型大致有普通成员变量、静态成员变量、成员常量这三种,还有一种组合的静态成员常量。

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

    static成员的所有者是类本身和对象,但是多个对象拥有一样的静态成员。从而在定义对象时不能通过构造函数对其进行初始化; 静态成员不能在类定义里边初始化,只能在class body外初始化; 静态变量依旧符合public、private、protect特性; 静态成员函数没有this指针,它不能返回非静态成员,因为除了对象会调用它外,类本身也可以调用 。

    C++静态成员变量:

    1. 必须在外部定义和赋值;
      • 不能在 main() 函数中定义
      • 不能在类的构造函数中定义
    2. 必须要定义静态变量,否则该变量没有内存空间(类中只是申明) ;
    3. 类本身可以直接调用静态变量
    4. 静态变量依旧符合public、private、protect特性

    C++成员变量声明、初始化、赋值说明列表:

    数据成员类型normalconststaticstatic const
    类内直接初始化(在声明时就赋值)×
    先声明再通过初始化列表赋初值××
    先声明再在构造函数体里赋初值×××
    先声明再在类外赋初值××

    5.C++静态成员方法

    1、静态方法可以被类直接调用,但是同静态变量一样符合public、private、protect特性

    2、静态成员函数不可以调用类的非静态成员。因为静态成员函数不含this指针。

    3、静态成员函数不可以同时声明为 virtual或后缀const 函数。因为virtual就是用来区分是哪个对象调用了他,与静态方法矛盾。而后缀const是用来修饰this指针的,静态变量中不包含this指针。

    参考资料:
    https://blog.csdn.net/nwd0729/article/details/47067549
    https://blog.csdn.net/buknow/article/details/80275191

    展开全文
  • 通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化
  • 考虑一下效率的可以再构造函数的初始化列表中进行。  class CA  {  public:  int data;  ……  public:  CA();  ……  };  CA::CA():data(0)//……#1……初始化列表方式  {  //data = 0;//...
  • 静态初始化的数组的长度必须是在程序中确定的常数,不能是由用户输入的变量 例子: int a[10];//正确 Student stud[10];//正确:Student是一个学生类 int n;cin>>n;int a[n];//错误 int n;cin>>n;Student stud[n];/...
  • C++ 成员变量初始化顺序问题详解 问题来源: 由于面试题中,考官出了一道简单的程序输出结果值的题:如下, class A { private: int n1; int n2; public: A():n2(0),n1(n2+2){} void Print(){ cout <&...
  • C++静态成员变量初始化

    千次阅读 2018-06-19 07:52:28
    class example{ public: //static double rate=6.5; static const int size; std::vector&lt;double&gt; vec(size); }; 代码是这样的。当时我一看,觉得没有错误啊。...size这个变量不是co...
    class example{  
    public:  
        //static double rate=6.5;  
        static const int size;  
         std::vector<double> vec(size);  
    };  

    代码是这样的。当时我一看,觉得没有错误啊。于是编译的时候总是出错!!这个错误提示说,这个类型是未定义的。size这个变量不是const int类型的吗,没有问题啊。

    在C++中,类对象的构造顺序是这样的:

    1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员
    2.进入构造函数后在构造函数中执行一般计算

    也就是说,在C++中,类中的成员在定义的时候不能被初始化,只有经过构造函数的构造之后才能被初始化。

    所以在这里,我们只能定义类中的静态容器vector


    像这样:

    static std::vector<double> vec;
    这样子才是正确的写法。
    C++中对于类中的静态变量的初始化方式是先在类中定义,再在类外面初始化。
    如果想在类中初始化这个vector容器的话,可以写一个构造函数,比如:
    1. class example{  
    2. public:  
    3. vector<double> vec;  
    4. example(): vec(5){}  
    5. };  

    这样子就可以解决了。最后总结一下关于类成员的定义和初始化:
    1,类内成员在被定义时是不能被初始化的,只能通过构造函数来进行初始化。
    2,类内静态变量的初始化方式是先在类内定义,再到类外面进行初始化。






    展开全文
  • 详解c++ 静态成员变量

    2020-12-17 00:17:53
    仔细琢磨静态成员变量,会发现其与C++的方式既相容也矛盾,具有特殊性。 先说相容的一面。·C/C++·有声明和定义的说法:声明给出签名,定义给出具体实现。对类型而言,声明不一定能知道其对象占用空间大小,但根据...
  • 而对于类的静态成员来说,同样是所有类共享一个静态成员,需要注意的是静态成员初始化 如下面代码 class A { public: static int a; // static int a = 1; // ERROR }; int A::a = 1; int main() { cout &l...
  • 静态成员变量: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员。和其他数据成员一样,静态数据成员也遵守public/protected/private访问规则。同时,静态数据成员还具有以下特点...
  • 可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例才会分配内存,所以静态成员不能访问非静态的成员。因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员...
  • C++中如何初始化静态成员变量

    千次阅读 2018-11-26 20:04:11
    例子,比如我们有一个People类,其中包含一个private的静态成员变量num class People{ private: static int num; public: void show(){ cout&lt;&lt;num&lt;&lt;"\n"; } } 静态...
  • static所声明的变量在Java中有一个初始化的先后顺序,带着这个问题接下来我们就来进行Java中static静态变量初始化完全解析:
  • c++类static成员变量初始化

    万次阅读 2019-05-10 23:12:38
    今天看到一个写法,竟然不知道这种写法。。。我是不是脑子完犊子了。。。 在test.h文件中: class A { public: ... //静态数据成员的定义和初始化 ...类中的静态成员变量初始化必须在类外实现!! ...
  • //静态成员变量在类外说明和初始化 static const int a; //静态常数据成员,可以在类里面初始化。 **//唯一能在类中初始化的成员只有一种,那就是静态常量成员** const int a; //要通过初始化列表赋值 [1]一般...
  • 类的静态成员变量初始化问题

    千次阅读 2019-08-12 20:24:37
    我们都知道类的静态成员变量必须在类外初始化,不仅如此,类的静态成员变量最好在源文件中初始化,而不能在头文件初始化,否则,编译的时候就会报错"symbol multiply defined". 举例: /*--testA.h--*/ class A ...
  • C++中静态成员函数与静态成员变量(static ) 这篇介绍了静态成员函数与静态成员变量,是我的读书笔记,我希望它够简短但又比较全面,起到复习的作用。如果有一些C++知识记不清楚了,它可以帮你很快回忆起来。 复习...
  • 童鞋们在学习C++的时候,往往只是按照书本上的原文去强行记忆各种特性,比方说,静态变量初始化一次。你心中一定在默念:一定要记住,static只会初始化一次云云,希望自己能够记住。告诉你,你为什么总是记不住,...
  • 一般来说,关于C++静态成员初始化,并不会让人感到难以理解,但是提到C++ 静态成员的”类内初始化”那就容易迷糊了。 我们来看如下代码: //example.h #include #include using namespace std; class Example{ ...
  • c++中的静态成员变量如何初始化

    千次阅读 2018-04-07 14:01:10
    class A   { static int a ; }   在A.cpp文件中这样初始化才可以 int A:: a = 3;
  • C++静态变量初始化时间

    千次阅读 2021-11-05 14:33:55
    本文表述了C++静态变量初始化时机
  • C++静态成员数据初始化问题

    千次阅读 2018-08-27 20:12:53
    静态成员变量:定义为静态成员意味着它能被所有的实例对象所共有,其修改值为该类的其它所有实例所见。 下面看一个例子 class people { public: people(int i):id(i) { num++; } private: static int num...
  • C++静态成员变量要在类外部再定义或初始化,否则会产生错误 **。 示例: class A { public: static int a; }; int A::a=0; 为什么要在类的外部进行定义的原因: 在类中,只是声明了静态变量,并没有定义。 声明...
  • C++类的静态成员变量一定要初始化(分配内存)

    万次阅读 多人点赞 2018-07-11 09:06:29
    我们知道C++类的静态成员变量是需要初始化的,但为什么要初始化呢。其实这句话“静态成员变量是需要初始化的”是有一定问题的,应该说“静态成员变量需要定义”才是准确的,而不是初始化。两者的区别在于:初始化是...
  • c++全局变量和静态局部变量初始化的时间 1.全局变量初始化在主函数之前 2.静态局部变量初始化在第一次调用这个静态局部变量之前 #include <iostream> using namespace std; class A { public: A(int a):m_a...
  • c++静态数据成员初始化方法

    千次阅读 2020-03-18 14:51:35
    类的静态成员变量初始化应该在类外进行 注意,不能在头文件初始化,只能在cpp文件中初始化,如果在声明中初始化, 在其它地方引用时相当于多次定义。 静态数据成员的使用方法和注意事项如下: 1、静态数据成员在...
  • C++成员变量初始化顺序

    千次阅读 2020-01-16 23:02:50
    首先,看一段程序: #include using namespace std;...下面是C++成员变量初始化顺序: 1) 基类的静态变量或全局变量 2) 派生类的静态变量或全局变量 3) 基类的成员变量 4) 派生类的成员变量
  • 静态变量和成员变量初始化时机 `静态变量:` 在class类首次被加载的时候进行初始化 `成员变量:` 在new对象的时候被初始化

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 110,488
精华内容 44,195
关键字:

c++静态成员变量初始化

c++ 订阅
友情链接: ME.rar