c++静态成员变量赋值

本文详细介绍了C++中类的静态成员变量与常量的声明、初始化及其使用规则。静态成员变量需要在类外部初始化,而常量成员变量必须在构造函数初始化列表中初始化。此外,静态成员变量可以被所有类的对象共享,而常量成员变量在对象生存期内保持不变。同时,文章强调了静态常量成员变量的初始化要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过类1给类2的变量赋值,要把类2需要赋值的变量声明在public,加static关键字,声明为静态成员变量。

在类2的cpp文件中,在类的外部(必要)给静态成员变量赋初值。
在类1中通过:类型名 类2::成员变量进行赋值操作。

ps:接收网络数据流unsigned char可以赋值给int型变量
而int型变量可以通过to_string(int变量)转换成string型。

static、const 和 static const 类型成员变量声明以及初始化

const 定义的常量在超出其作用域之后其空间会被释放,而 static 定义的静态常量在函数执行后不会释放其存储空间。
static 表示的是静态的。类的静态成员函数、静态成员变量是和类相关的,而不是和类的具体对象相关的。即使没有具体对象,也能调用类的静态成员函数和成员变量。一般类的静态函数几乎就是一个全局函数,只不过它的作用域限于包含它的文件中。
在 C++ 中,static 静态成员变量不能在类的内部初始化。在类的内部只是声明,定义必须在类定义体的外部,通常在类的实现文件中初始化。
在 C++ 中,const 成员变量也不能在类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数。
const 数据成员 只在某个对象生存期内是常量,而对于整个类而言却是可变的。

//-----------------Test.h----------------------------
#pragma once
class Test
{
private :
    int putong;//普通变量
    // int putong= 1; 错误的初始化方法
    const int changliang ;//常量
    // const int changliang =1; 常量的错误初始化方法
    static int jingtai;//静态成员变量
    // static int jingtai=1; 错误,只有静态常量int成员才能直接赋值来初始化
    static const int jingtaichangliang1=1; //正确,静态常量成员可以直接初始化    
    static const int jingtaichangliang2;
public:
    Test(void);
    ~Test(void);
};
//--------------------Test.cpp-----------------------------------
#include ".\test.h"
 
int Test::jingtai = 1; //静态成员的正确的初始化方法
 
// int Test::putong = 1; 错误,静态成员才能初始化
// int Test::changliang = 1; 错误
// int Test::jingtaichangliang2 = 1; // 错误的方法,提示重定义
Test::Test(void):putong (1),changliang(1)正确的初始化方法//jingtai(1)不能在这里初始化
{
    putong =1; //正确, 普通变量也可以在这里初始化
    //changliang = 1; 错误,因为常量不能赋值,只能在 "constructor initializer (构造函数的初始化列表)" 那里初始化
          
    jingtai =1; //这个赋值是正确的,改变静态成员变量的值。
}

a. 常量型成员变量 b. 引用型成员变量 c. 静态成员变量 d. 整型静态常量成员变量 e. 非整型静态常量成员变量

#include <iostream>
using namespace std;     
 
class BClass
{
public:
    BClass() : i(1),ci(2), ri(i) // 对于常量型成员变量和引用型成员变量,必须通过参数化列表的方式进行初始化。在构造函数体内进行赋值的方式,是行不通的。  
    {            
    } 
 
    void print_values()
    {
        cout<< "i =\t" << i << endl;
        cout<< "ci =\t" << ci << endl;
        cout<< "ri =\t" << ri << endl;
        cout<< "si =\t" << si << endl;
        cout<< "csi =\t" << csi << endl;
        cout<< "csi2 =\t" << csi2 << endl;
        cout<< "csd =\t" << csd << endl;
    }
 
private:
    int i; // 普通成员变量
    const int ci; // 常量成员变量
    int &ri; // 引用成员变量
    static int si; // 静态成员变量
    //static int si2 = 100; // error: 只有静态常量成员变量,才可以这样初始化
    static const int csi; // 静态常量成员变量
    static const int csi2 = 100; // 静态常量成员变量的初始化(Integral type) (1)
    static const double csd; // 静态常量成员变量(non-Integral type)
    //static const double csd2 = 99.9; // error: 只有静态常量整型数据成员才可以在类中初始化
};
// 静态成员变量的初始化(Integral type)
int BClass::si = 0;
// 静态常量成员变量的初始化(Integral type)
const int BClass::csi = 1;
// 静态常量成员变量的初始化(non-Integral type)
const double BClass::csd = 99.9;

可见派生类与基类共用静态数据成员。
静态数据成员可以成为成员函数的可选参数,而普通数据成员则不可以。
静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为所属类类型的指针或引用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值