[转]C++ 类中的static成员的初始化和特点

C++的类中有些成员变量初始化和一般数据类型的成员变量有所不同。以下测试编译环境为:

cpp;gutter:true; ➜ g++ -v Using built-in specs.</p> <p>COLLECT_GCC=g++ Target: x86_64-linux-gnu gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)</p> <pre><code> 测试代码(g++编译通过): ;gutter:true;
#include

using namespace std;

class Test
{
public:
Test() : y(1), r(y), d(3){} //对于常量型成员变量和引用型成员变量,必须通过参数化列表的方式进行初始化。
~Test(){}

int y; //普通变量成员
int &r; //引用成员变量
const int d; //常量成员变量
static int c; //静态成员变量
static const int x = 2.1; //静态常量整型成员变量
static const int xx; //静态常量整型成员变量声明
static const double z; //静态常量非整型成员变量声明
static const float zz = 6.6; //静态常量非整型成员变量
};

const int Test::xx = 4; //静态常量整型成员变量定义
const double Test::z = 5.1; ////静态常量非整型成员变量定义
int Test::c = 2;

int main(void)
{
cout << Test::x << endl;

return 0;
}

这些特殊类型的成员变量主要有:

cpp;gutter:true; 1. 引用 2. 常量 3. 静态变量 4. 静态整型常量 5. 静态非整型常量</p> <pre><code> * 对于==1. 引用==和==2. 常量==,成员变量必须通过构造函数的==参数列表==的方式初始化。例如:上述程序中的r 和 d 变量的初始化。 * 对于==3. 静态变量==,static成员变量需要在类定义体外进行初始化与定义,因为static数据成员独立该类的任意对象存在,它是与类关联的对象,不与类对象关联。例如:上述程序中的c变量的初始化。 * 对于==4. 静态整型常量==,该类型成员可以直接在类中初始化,也可以在类中声明,在类定义体外进行定义。例如:上述程序中的x和xx变量。 * 对于==5. 静态非整型常量==,该类型也是可以在类中声明在类定义体外进行定义,或者直接在类中定义初始化。例如:上述程序中的z和zz变量。 ### 结论: 静态成员属于类作用域,但不属于类对象,它的生命周期和普通的静态变量一样,程序运行时进行分配内存和初始化,程序结束时则被释放。所以不能在类的构造函数中进行初始化。 ### static成员的优点 * static成员的名字是在类的作用域中,因此可以避免与其它类成员或全局对象名字冲突。 * 可以实施封装,static成员可以是私有的,而全局对象不可以。 * 阅读程序容易看出static成员与某个类相关联,这种可见性可以清晰地反映程序员的意图。 ### static成员函数特点 * 因为static成员函数没有this指针,所以静态成员函数不可以访问非静态成员。 * 非静态成员函数可以访问静态成员。 * 静态数据成员与类的大小无关,因为静态成员只是作用在类的范围而已。 ;gutter:true;
#include

using namespace std;

class test2
{
public:
test2(int num) : y(num){}
~test2(){}

static void testStaticFun()
{
cout << "y = " << y << endl; //Error:静态成员函数不能访问非静态成员
}

void testFun()
{
cout << "x = " << x << endl;
}
private:
static int x;//静态成员变量的引用性说明
int y;
};

int test2::x = 10;//静态成员变量的定义性说明

int main(void)
{
test2 t(100);
t.testFun();

return 0;
}

static用法总结
– c语言中:
+ 用于函数内部修饰变量,即函数内的静态变量。这种变量的生存期长于该函数,使得函数具有一定的”状态”。使用静态变量的函数一般是不可重入的,也不是线程安全的,比如strtok(3)。
+ 用在文件级别(函数体之外),修饰变量或函数,表示该变量或函数只在本文件可见,其他文件看不到也访问不到该变量或函数。专业的说法叫”具有internal linkage”(简言之:不暴露给别的translation unit)。
– c++语言中(由于C++引入了类,在保持与C语言兼容的同时,static关键字又有了两种新用法):
+ 用于修饰类的数据成员,即所谓”静态成员”。这种数据成员的生存期大于class的对象(实例/instance)。静态数据成员是每个class有一份,普通数据成员是每个instance 有一份。
+ 用于修饰class的成员函数,即所谓”静态成员函数”。这种成员函数只能访问静态成员和其他静态程员函数,不能访问非静态成员和非静态成员函数。

Original: https://www.cnblogs.com/wlzy/p/10890414.html
Author: ZYVV
Title: [转]C++ 类中的static成员的初始化和特点

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535100/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • C++应该更多使用堆还是栈?

    栈,是不需要涉及内存分配的,你可以把它看成一个很长的连续内存,用来执行函数。自动以先进后出的方式使用。具体的进出在C++里你可以假设是不能操纵这个栈的,实际上它存在。 _main函…

    C++ 2023年5月29日
    055
  • NDK自带的c/c++库

    1.官方文档 https://developer.android.google.cn/ndk/guides/stable_apis https://developer.androi…

    C++ 2023年5月29日
    065
  • vs不同版本支持的c++版本和PlatformToolset,及在vs中切换c++版本

    找c++资料从网上找确实更快速,但要想深入地理解vc++建议看msdn文档。 vs不同版本支持的c++版本 C++17:vs2017基本支持,vs2015部分支持。C++14:vs…

    C++ 2023年5月29日
    071
  • VC++.net 整合开发环境使用技巧

    VC++.net 整合开发环境使用技巧 在下面我将会以条目的形式为大家描述VC.net2003的各项使用技巧,你完全可以挑选你感兴趣的内存来看,甚至不看都无所谓哈,只求你的一点支持…

    C++ 2023年5月29日
    056
  • C++ CRTP

    CRTP 英:The curiously recurring template pattern (CRTP) is a C++ idiom in which a class X d…

    C++ 2023年5月29日
    086
  • js c++ 多值返回 返回多个值 c++ tuple

    使用C# 7.0推出的值元组和解构功能。 static (int, int) Calc(int a, int b) { return (a + b, a – b); } stati…

    C++ 2023年5月29日
    063
  • C++11 动态内存管理

    内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能,更大的自由,C++菜鸟的收获则是一遍一遍的检查代码和对C++的痛恨,但内存管理在C+…

    C++ 2023年5月29日
    050
  • 拓扑排序(二)之 C++详解

    拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph简称DAG)进行排序进而得到一个有序的线性序列。 这样说,可能理解…

    C++ 2023年5月29日
    044
  • 您的第一个C++Builder程序(Hello, world!)

    最近有些老旧的项目是C++Builder开发的,虽然和Delphi的IDE的界面和操作十分相似,但是还是找本《C++ Builder 5 Developer’s Gui…

    C++ 2023年5月29日
    059
  • C++ 总结

    1、迭代器并不是都可以进行加减 迭代器实质上是一个指针,但是,并不是所有的容器的迭代器可以支持加减操作。 能进行算术运算的迭代器只有随机访问迭代器,要求容器元素存储在连续内存空间内…

    C++ 2023年5月29日
    064
  • EclipseC++学习笔记-7 汉化

    1、复制https://download.eclipse.org/technology/babel/update-site/latest/ 注意要和版本保持一致,如果版本不对安装之…

    C++ 2023年5月29日
    062
  • Delphi XE8,C++ Builder XE8,RAD Studio XE8 官方 ISO 文件下载,附激活工具

    RAD Studio XE8 v22.0.19027.8951 官方ISO下载(6.72G):http://altd.embarcadero.com/download/radstu…

    C++ 2023年5月29日
    076
  • Visual C++ 运行库合集包完整版 v20201209

    Microsoft Visual C++ Redistributable(系统运行库,简称MSVC,VB/VC)是Windows操作系统应用程序的基础类型库组件。 此版Visual…

    C++ 2023年5月29日
    070
  • c++11 auto 与 decltype 详解

    一. auto简介 编程时候常常需要把表达式的值付给变量,需要在声明变量的时候清楚的知道变量是什么类型。然而做到这一点并非那么容易(特别是模板中),有时候根本做不到。为了解决这个问…

    C++ 2023年5月29日
    061
  • c++ union内存

    看一个例子: 输出结果: 为什么是这样的呢? 因为A是union,所以在内存中存储的格式为: 高地址 ————> 低地址 12…

    C++ 2023年5月29日
    047
  • (筆記) 如何寫入binary file某個byte的值? (C/C++) (C)

    Abstract通常公司為了保護其智慧財產權,會自己定義檔案格式,其header區會定義每個byte各代表某項資訊,所以常常需要直接對binary檔的某byte直接進行寫入。 In…

    C++ 2023年5月29日
    047
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球