刚开始学习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进行输出的时候也是可以输出的,这也说明了这个数据成员确实可以被所有的对象进行引用,并且值都是相同的,因为它本身就不属于任何一个对象。

好啦,大家晚安!

C++类中的常数据成员和静态数据成员的区别的更多相关文章

  1. Cocos2d-x 3.1.1 学习日志3--C++ 初始化类的常量数据成员、静态数据成员、常量静态数据成员

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u011292087/article/details/37598919 有关const成员.stati ...

  2. 一个类的实例化对象所占空间的大小(对象大小= vptr(可能不止一个) + 所有非静态数据成员大小 + Aligin字节大小(依赖于不同的编译器))

    注意不要说类的大小,是类的对象的大小. 首先,类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的. 用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小. 如果 Class ...

  3. 静态数据成员(面向对象的static关键字)

    静态数据成员: 在类内数据成员的声明前加上关键字static,该数据成员就是类内的静态数据成员.先举一个静态数据成员的例子. #include<iostream> using namesp ...

  4. 转:C语言中的static变量和C++静态数据成员(static member)

    转自:C语言中的static变量和C++静态数据成员(static member) C语言中static的变量:1).static局部变量        a.静态局部变量在函数内定义,生存期为整个程序 ...

  5. C++静态数据成员与静态成员函数

    一般情况下,如果有n个同类的对象,那么每一个对象都分别有自己的数据成员,不同对象的数据成员各自有值,互不相干.但是有时人们希望有某一个或几个数据成员为所有对象所共有,这样可以实现数据共享. 可以使用全 ...

  6. C++ 静态数据成员和静态成员函数

    一 静态数据成员: 1.静态数据成员的定义. 静态数据成员实际上是类域中的全局变量.所以,静态数据成员的定义(初始化)不应该被放在头文件中,因为这样做会引起重复定义这样的错误.即使加上#ifndef ...

  7. 类中成员函数与数据成员private/pubic/protected

    类中成员函数与数据成员private/pubic/protected

  8. C++中静态数据成员

    类的静态成员不能由类的构造函数来初始化.因为即使不存在类的任何对象时,类的静态成员依然存在并且可以被使用.类的静态成员也不能访问任何类的非静态成员. 类名和类对象都可以直接调用静态数据成员.因为静态数 ...

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

    from:://http://blog.csdn.net/taina2008/article/details/1684834 把类中的函数都定义成静态函数,这样相当于在编译时就分配了空间,这样不需要实 ...

随机推荐

  1. Data Structure Linked List: Write a function to get the intersection point of two Linked Lists.

    http://www.geeksforgeeks.org/write-a-function-to-get-the-intersection-point-of-two-linked-lists/ 第一第 ...

  2. Data Structure Array: Longest Monotonically Increasing Subsequence Size

    http://www.geeksforgeeks.org/longest-monotonically-increasing-subsequence-size-n-log-n/ #include < ...

  3. Data Structure Binary Tree: Convert a given Binary Tree to Doubly Linked List

    http://www.geeksforgeeks.org/in-place-convert-a-given-binary-tree-to-doubly-linked-list/ #include &l ...

  4. flex TweenLite

    本贴已在 AS天地会转发,大家可以参考:http://bbs.actionscript3.cn/viewthread.php?tid=11090&pid=91142&page=1&am ...

  5. ios中文模糊搜索兼容问题

    $(function(){ var cpLock = true; $("input[name='name']").off().on({ compositionstart: func ...

  6. 吴恩达机器学习笔记(四) —— BP神经网络

    主要内容: 一.模型简介 二.一些变量所代表的含义 三.代价函数 四.Forward Propagation 五.Back Propagation 六.算法流程 待解决问题: 视频中通过指出:当特征变 ...

  7. 算法(Algorithms)第4版 练习 1.3.31

    双向链表实现: //1.3.31 package com.qiusongde.linkedlist; public class DoublyLinkedList<Item> { priva ...

  8. JavaScript 使用技巧(持续更新)

    JavaScript 使用技巧(持续更新) 类型检测 使用Object.prototype.toString.call(obj)的方式. 因为无论typeof还是instanceof都无法做到精确判断 ...

  9. Codeforces 158E Phone Talks:dp

    题目链接:http://codeforces.com/problemset/problem/158/E 题意: 你有n个电话要接,每个电话打进来的时刻为第t[i]分钟,时长为d[i]分钟. 每一个电话 ...

  10. zookeeper+dubbo问题

    1.java.lang.IllegalStateException: Context namespace element 'component-scan' and its parser class [ ...