首页 > 编程语言 >C++入门到放弃(08)——类成员:const 和 static用法

C++入门到放弃(08)——类成员:const 和 static用法

时间:2023-08-03 22:12:50浏览次数:43  
标签:初始化 const int 成员 C++ num static

​1.常量成员 const

类的常量成员,具备以下特性:

1.1.const成员必须被初始化

1.2.const成员只能在初始化列表中赋值

1.3.const成员不能在构造函数原型中赋值

1.4.const成员初始化之后无法更改

class ConstMember
{
public:
    ConstMember(int num = 0) 
        :m_num(num)        //ok,对应1、2,否则无法通过编译
    {
        //m_num = num;    //error,对应3,只能在初始化列表内赋值
    }
    ~ConstMember() {} ;
    void set(int num = 0) {
        //m_num = num;    //error,对应4,const变量无法被更改
    }
    const int getNum() { return m_num; }
private:
    const int m_num;
};

int main(){
    ConstMember c1;
    cout << "c1 = " << c1.getNum() << endl;    // 输出0
    ConstMember c2(2);
    cout << "c2 = " << c2.getNum() << endl;    // 输出2
    c1.set(3);    //无法被更改,否则会报错
    cout << "c1 = " << c1.getNum() << endl;    // 输出0
    return 0;
}

2.静态成员 static

类的静态成员,具备以下特性:

2.1.static成员必须被初始化,只能在类的外面进行初始化,且不能带static关键字

2.2.static成员不能在初始化列表中初始化

2.3.static成员可以在构造函数原型中被更改

2.4.static成员可以被外部更改

2.5.static成员被所有的此类共享,在某个类中改变其数值,会影响其它同类当中的该成员数值

class StaticMember
{
public:
    StaticMember(int num = 0)
        //:m_num(num)    //error,对应2,不能在初始化列表赋值
    {
        m_num = num;    //ok,对应3,可以在构造函数内赋值
    }
    ~StaticMember() {} ;
    void set(int num = 0) {
        m_num = num;    //ok,对应4,可以改变值
    }
    const int getNum() { return m_num; }
private:
    static int m_num;
};

int StaticMember::m_num = 0;    //对应1,必须在外部赋值

int main(){
    StaticMember s1;
    cout << "s1 = " << s1.getNum() << endl;    // 输出0
    StaticMember s2(2);
    cout << "s2 = " << s2.getNum() << endl;    // 输出2
    s1.set(3);
    cout << "s1 = " << s1.getNum() << endl;    // 输出3
    cout << "s2 = " << s2.getNum() << endl;    // 输出3,对应5,改变s1当中的静态变量,导致s2中的也发生改变
    return 0;
}

3.静态常量成员 static const

类的静态常量成员,具备以下特性:

1.static const成员必须被初始化,只能在类的外面进行初始化,且不能带static关键字,必须带const关键字

2.static const成员不能在初始化列表中初始化

3.static const成员不可以在构造函数原型中被更改

4.static const成员不可以被外部更改

5.static const成员被所有的此类共享

class StaticConstMember
{
public:
    StaticConstMember(int num = 0)
        //:m_num(num)    //error,对应2,不能在初始化列表赋值
    {
        //m_num = num;    //error,对应3,不能在构造函数内
    }
    ~StaticConstMember() {} ;
    void set(int num = 0) {
        //m_num = num;    //error,对应4,不能更改值
    }
    const int getNum() { return m_num; }
private:
    static const int m_num;
};

const int StaticConstMember::m_num = 0;    //对应1,在外部初始化

int main(){
    StaticConstMember sc1;
    cout << "sc1 = " << sc1.getNum() << endl;    // 输出0
    StaticConstMember sc2(2);
    cout << "sc2 = " << sc2.getNum() << endl;    // 输出0,共享静态变量,且无法修改,因此不改变值
    sc1.set(3);
    cout << "sc1 = " << sc1.getNum() << endl;    // 输出0,共享静态变量,且无法修改,因此不改变值
    cout << "sc2 = " << sc2.getNum() << endl;    // 输出0,共享静态变量,且无法修改,因此不改变值
    return 0;
}

4.静态成员函数

静态成员函数包含以下特性:

1.静态成员函数可以不构造类,直接调用

调用方式为 类名::函数名。

2.静态成员函数不能包含内部任何形式的非静态成员

3.静态成员函数可以接受外部参数

4.静态成员函数可以包含内部静态成员

class StaticFunction {
public:
    static void Helloworld() {
        cout << "Hello world" << endl;
    }
    static void SetValue(int a) {    //参考4,可以接受外部参数
        //m_s = m_i;    //error,参考2,不能包含任何非静态成员
        //m_s = m_c;    //error,参考2,不能包含任何非静态成员
        m_s = 4;    //参考3,可以包含非静态成员
        m_s = a;    
    }
private:
    int m_i;
    const int m_c;
    static int m_s;
};

int StaticFunction::m_s = 1;

int main(){
    StaticFunction::Helloworld();    //参考1,无需构造类,直接调用
    StaticFunction::SetValue(2);
    return 0;
}


标签:初始化,const,int,成员,C++,num,static
From: https://www.cnblogs.com/wyqmx/p/17604609.html

相关文章

  • 设计模式 C++
    参考博客:https://blog.csdn.net/weixin_45712636/article/details/124328504参考视频:https://www.bilibili.com/video/BV1Np4y1z7BU?p=1&vd_source=fce372ba0aa0bf9ed76094e3192b7015参考文档:https://bright-boy.gitee.io/technical-notes/#/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%......
  • C++职工管理系统项目实战
    职工管理系统1.管理系统需求职工管理系统可以用来管理公司内所有员工的信息,利用C++来实现一个基于多态的职工管理系统公司中职工分为三类:普通员工、经理、老板,显示信息时,需要显示职工编号、职工姓名、职工岗位、以及职责普通员工职责:完成经理交给的任务经理职责:完成老板......
  • 125.C++中的size_t
    125.C++中的size_t1.size_t●size_t是一些C/C++标准在stddef.h中定义的,size_t类型表示C中任何对象所能达到的最大长度,它是无符号整数●它是为了方便系统之间的移植而定义的,不同的系统上,定义size_t可能不一样。size_t在32位系统上定义为unsignedint,也就是32位无符号整型。在64......
  • C++ STL
    1.初始头文件c++标准库不包括.h,#include;c旧库需要包括.h,#include<stdio.h>;c新库在旧库前面加c,不需要包含.h,#include。旧头文件不被封装在std命名空间中。网站资源www.cplusplus.comcppreference.comgcc.gnu.org书籍2.STL体系结构部件六大部件:容器、分配器、......
  • C++ | extern "C" 的用法
    extern"C"是C++中的一种用法(无法在C语言中使用),其作用是修饰一段代码,将其用C语言的方式进行编译。那么,使用C语言方式进行编译与使用C++方式进行编译又有什么区别呢?在C++中,支持函数重载:voidfunc();voidfunc(inta,intb);voidfunc(doublea,floatb);但在C语言中如果......
  • C++基础
    Talkischeap.Showmethecode.C++分为C++语言和C++标准库 版本演化可分为C++98(1.0),C++11(2.0),C++14话不多说,上代码头文件命名方式,例如complex.h首先要写防卫式声明,以前写的时候只是知道要写,现在知道才叫什么。1#ifndef_MYCOMPLEX_2#define_MYCOMPLEX_34......
  • Linux平台C++读写Word文档(DuckX库)
    1、安装cmake如果没有cmake或者cmake版本太旧,都需要进行重新安装此次推荐直接安装编译好的软件包进入官网:https://cmake.org/download/下载后直接在拷贝到系统里进行解压添加环境变量vim/etc/profile添加下面这条命令,路径换成自己安装的路径exportPATH=$PATH:/root......
  • c++
    1,2章输出printf(    输入scanf(一,变量通用形式<类型名><变量名>变量名=标识符(不能用数字开头,不能用关键字/保留字)前缀const【不变的】即锁定变量值(不允许改变)若变量要作为赋值则变量初始时要赋值(初始化) eg:inta; =》inta=0;二,浮点数类型名:int整点   do......
  • const char * 与 char * 不兼容,QString转换时出现的问题
    QStringcameraIniPath=QString::fromLocal8Bit(m_sCameraIniPath[nIndex]);方式一(char*)cameraIniPath.toStdString().c_str()方式二charsDirPath[200];sprintf_s(sDirPath,"%s",cameraIniPath.toLocal8Bit().constData());//QString转char*方式三VS......
  • 遵守 MISRA 如何提高C++应用的安全性
    Perforce在支持需要稳定和安全的应用程序方面有着悠久的历史。凭借50多年的应用程序开发经验,从客户、趋势和竞争对手那里学到了很多东西。Perforce从软件开发的所有领域都采用了最佳实践,并试图将这些实践应用于Perforce所做的一切。Perforce采用了单元测试、自动化测试、敏捷开......