C++类中的常数据成员与静态数据成员之间的区别_C 语言

刚开始学习C++的类和对象的部分,对类中的常数据成员和静态数据成员的概念和用法经常混淆,所以今天整理一下,顺便说一下,今天是我的生日,祝我生日快乐,呵呵。

常数据成员
常数据成员是指在类中定义的不能修改其值的一些数据成员,类似于我们以前学过的常变量,虽然是变量,也有自己的地址,但是一经赋初值,便不能再被修改。

适用于类中定义一些初始化之后不希望被修改的变量。

定义方法:

复制代码 代码如下:

const 类型名 变量名;

(1)类中的常数据成员只能通过构造函数的参数初始化表进行初始化。

(2)常数据成员是实例化对象的一部分,可以用this指针访问。

复制代码 代码如下:

#include<iostream>
using namespace std;
class Happy_birthday
{
 public:
   Happy_birthday(char * na):name(na){}
   void Print()
   {
    cout<<name<<" Happy Birthday!"<<endl;
   }
 private:
  const char * name;
};
int main()
{
 Happy_birthday qianshou("赵哲");
 qianshou.Print();
 return 0;
}

运行结果:

静态数据成员
其实常数据成员和静态数据成员完全是两码事,只不过一开始学习的时候容易混淆罢了。通过上面的解释,我们知道常数据成员类似常变量,是一种一经赋值就不可以改变的变量。

它们最大的区别就是静态数据成员是可以被修改的,而且可以被任何一个对象修改,修改后的值,可以被所有的对象共享。

静态数据成员是属于一个类的而不是某一个对象,它是为该类所定义的所有的对象所共有。该类所定义的对象都可以引用该静态成员,并且值都是一样的。

静态数据成员的存储空间不同于普通的数据成员,它不属于类的任何一个对象,是独立于对象存储的,因此也不可以通过对象的this指针来访问。

并且,静态数据成员不可以用参数初始化表进行初始化操作,原因很简单,因为初始化表是在定义对象的时候进行的利用了this指针进行操作,所以不可以。

静态数据成员的定义的方式:

复制代码 代码如下:

static int num;

访问方式:

可以通过类名直接访问:

复制代码 代码如下:

Test::s_num;

也可以通过对象名访问:

复制代码 代码如下:

one.s_num;

不过为了区别于其他的成员变量,一般使用类名进行访问,因为静态数据成员不属于对象,以免使人误解。

复制代码 代码如下:

#include<iostream>
using namespace std;
class Test
{
 public:
  Test(int n):c_num(n){};//只能用初始化表对常数据成员赋初值
  void show()
  {
   cout<<"c_num:"<<this->c_num<<endl;
   cout<<"s_num:"<<s_num<<endl;
  }
  void change(int n)
  {
   s_num=n; 
  }
  static int s_num;
 private:
  const  int c_num;
};
int Test::s_num=100;//在类体为对静态数据成员赋初值
int main()
{
 Test one(10);
 one.show();
 one.change(10000);//改变静态数据成员的值
 cout<<"one changeed:"<<one.s_num<<endl; //使用对象名one间接访问静态数据成员
 cout<<"Test changeed:"<<Test::s_num<<endl;//使用类名直接访问静态数据成员
 Test two(20);
 cout<<"two changeed:"<<two.s_num<<endl; //使用对象名two间接访问静态数据成员
 two.change(99);
 cout<<"Test changeed:"<<Test::s_num<<endl;//使用类名直接访问静态数据成员
 return 0;
}

运行结果:

分析: 我们在程序中可以使用类名直接访问静态数据成员变量,就直接说明了它不属于任何一个对象的这个特点。 我们在定义对象two的时候只对c_num进行了赋值,但是我们使用two.s_num进行输出的时候也是可以输出的,这也说明了这个数据成员确实可以被所有的对象进行引用,并且值都是相同的,因为它本身就不属于任何一个对象。

时间: 2025-01-18 12:36:20

C++类中的常数据成员与静态数据成员之间的区别_C 语言的相关文章

【求助】派生类中的函数访问基类同名数据成员的问题

问题描述 /*2008年5月20日14:28:54派生类中的函数访问基类同名数据成员的问题*/usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespace继承_同名覆盖问题{classProgram{classA{publicinta=10;}classB:A{newpublicinta=2;//B类的a"覆盖"了基类的apublicvoidf(){Console.WriteLine(a);//请问如何在本

C++中Overload,Override,Hide之间的区别_C 语言

一. 简介•Overload: 重载,指函数同名,但是参数个数不同.或者参数类型不同的多个实现.(如果参数相同但是仅仅返回值不同不是重载,编译器会报错.) 编译器判断重载函数:•第一步,是确定该调用中所考虑的重载函数的集合,该函数集合被称为候选函数(candidant function).所谓候选函数就是与被调用函数同名的函数. •第二步,分为两动作:第一个动作是编译器从第一步选出的候选函数中调出可行函数(viable function).可行函数的函数参数个数与调用的函数参数个数相同,或者可行

详解C++中的const关键字及与C语言中const的区别_C 语言

const对象默认为文件的局部变量,与其他变量不同,除非特别说明,在全局作用域的const变量时定义该对象的文件局部变量.此变量只存在于那个文件中中,不能别其他文件访问.要是const变量能在其他文件中访问,必须显示的指定extern(c中也是)   当你只在定义该const常量的文件中使用该常量时,c++不给你的const常量分配空间--这也是c++的一种优化措施,没有必要浪费内存空间来存储一个常量,此时const int c = 0:相当于#define c 0:    当在当前文件之外使用

C++类静态数据成员与类静态成员函数

在没有讲述本章内容之前如果我们想要在一个范围内共享某一个数据,那么我们会设立全局对象,但面向对象的程序是由对象构成的,我们如何才能在类范围内共享数据呢? 这个问题便是本章的重点: 声明为static的类成员或者成员函数便能在类的范围内共同享,我们把这样的成员称做静态成员和静态成员函数. 下面我们用几个实例来说明这个问题,类的成员需要保护,通常情况下为了不违背类的封装特性,我们是把类成员设置为protected(保护状态)的,但是我们为了简化代码,使要说明的问题更为直观,更容易理解,我们在此处都设

C++类成员构造函数和析构函数顺序示例详细讲解_C 语言

对象并不是突然建立起来的,创建对象必须时必须同时创建父类以及包含于其中的对象.C++遵循如下的创建顺序: (1)如果某个类具体基类,执行基类的默认构造函数. (2)类的非静态数据成员,按照声明的顺序创建. (3)执行该类的构造函数. 即构造类时,会先构造其父类,然后创建类成员,最后调用本身的构造函数. 下面看一个例子吧 复制代码 代码如下: class c{public:    c(){ printf("c\n"); }protected:private:}; class b {pub

解析static在C和C++中的用法以及区别_C 语言

static主要有三个作用:(1)局部静态变量(2)外部静态变量/函数(3)静态数据成员/成员函数 前两种C和C++都有,第三种仅在C++中有,下面分别作以下介绍: 一.局部静态变量在C/C++中, 局部变量按照存储形式可分为三种auto, static, register.其中register不常用到,下面主要说说auto和static的区别. 1. 存储空间分配和生存周期不同auto类型局部变量就是普通的局部变量(不加修饰的局部变量默认为该类型).该类型局部变量存储在栈上,在动态存储区,生命

c# static 静态数据成员_实用技巧

① 静态成员属于类所有,非静态成员属于类的实例所有. ② 每创建一个类的实例,都市在内存中为非静(动)态成员新分派一块存储: 静态成员属于类所有,为各个类的实例所公用,无论类创建了几多实例,类的静态成员在内存中只占同一块区域. 静态数据成员区别于动态数据成员,静态变量并不是稳定的,只是静态变量在声明的时候不管有没有赋值,都市凭据它的类型分派对应的内存空间,他的可访问性和作用区间与动态变量是一样的 ==================================================

C++静态数据成员实现

静态数据成员是在一个类中用关键字static声明的数据成员.在C++中,一般使用静态成员来代替C语言的全局变量,以达到数据共享.C和C++的全局变量有一定的局限性,可以任意被修改,也容易和其它的变量名冲突,故在C++中,一般不使用全局变量. 静态数据成员必须进行初始化,初始化应在类体外进行,静态数据成员也可以引用,但不能引用私有数据部分. 接下来看一个例子: #include <iostream> #include <cstring> using namespace std ; c

深入分析C++中声明与定义的区别_C 语言

        首先谈下声明与定义的区别.         声明是将一个名称引入程序.定义提供了一个实体在程序中的唯一描述.声明和定义有时是同时存在的. 如int a; extern int b=1;     只有当extern中不存在初始化式是才是声明.其他情况既是定义也是声明.      但是在下列情况下,声明仅仅是声明: 1:仅仅提供函数原型.如void func(int,int); 2: extern int a; 3:class A: 4:typedef声明 5:在类中定义的静态数据成