C++ 类的常成员和静态成员

来源:互联网 发布:mac 看盘软件 编辑:程序博客网 时间:2024/05/19 16:49

对象的动态分配:

matrix *matrixp;            //定义对象指针,此过程不调用构造函数,需要自己分配空间和释放空间matrixp = new matrix;       //用数据类型分配空间,用new是用堆分配空间需要deletedelete matrixp;matrixp = new matrix();     //调用构造函数delete matrixp;matrixp = new matrix[3];delete []matrixp;matrix B(A);                //用对象A定义B,自动调用拷贝构造函数,参数值传递过程也是如此matrix matrixarray[3];      //定义对象数组

类中的常成员与静态成员:
常数据成员、常函数成员
静态数据成员、静态函数成员
常数据成员的语法细则
– 关键字const。在类定义中声明常数据成员需使用关键字const进行限
定,声明时不能初始化
初始化列表。**类中的任何函数都不能对常数据成员赋值,包括构造
函数。**为构造函数添加初始化列表是对常数据成员进行初始化的唯
一途径。在构造函数的函数头后面添加初始化列表:
构造函数名( 形参列表 ) : 常数据成员名1( 形参1 ), 常数据成员名2( 形参2 ), ……
{
…… // 在函数体中初始化其它数据成员
}
形参1、形参2等是从形参列表中提取出来的,并在初始化列表中进行二次接力传递
– 定义对象时初始化。定义含常数据成员类的对象时需要初始化,给出常数据成员的初始值

常函数成员的语法细则
– 声明、定义常函数成员需在函数头后面加关键字const进行限定
常函数成员只能读类中的数据成员,不能赋值修改
常函数成员只能调用其它常函数成员。换句话说,常函数成员不能
调用其它无const限定的函数成员,以防这些函数间接修改了数据成

通过常对象只能调用其常函数成员。换句话说,通过常对象不能调
用无const限定的函数成员,以防这些函数间接修改了常对象的数据
成员
– 除形参个数、类型之外,还可以用关键字const区分类中的重载函数
这里写图片描述

静态数据成员的语法细则
– 关键字static。在类定义中声明静态数据成员需使用关键字static进行限定,
声明时不能初始化。例如,例7-12中的代码第6行
– 定义及初始化。必须在类声明的大括号外面(通常是和函数成员定义一起
放在类实现部分)对静态成员进行定义,定义时不能再加关键字static。定
义时可以初始化。例如,例7-12中的代码第12行
– 在同类函数成员中访问。在同类的函数成员中访问静态数据成员直接使用
其成员名访问,访问时不受权限约束
– 在类外其它函数中访问。在类外其它函数(例如主函数)中访问静态数据
成员需以“类名 :: 静态数据成员名”的形式访问,或通过任何一个该类对
象以“对象名.静态数据成员名”的形式访问。类外访问受权限约束,只能
访问公有的静态数据成员
– 生存期及作用域。和全局变量一样,静态数据成员是静态分配的,程序加
载后立即分配内存,直到程序执行结束退出时才被释放。访问权限决定静
态数据成员的作用域。私有静态数据成员具有类作用域,只能在类内访问。
公有静态数据成员具有文件作用域,可以被本文件中的任何函数访问,并
且可通过类声明将其作用域扩展到任何程序文件
这里写图片描述

静态函数成员的语法细则
– 声明时使用关键字static进行限定,定义时不能再使用关键字static
静态函数成员只能访问类中的静态数据成员,因为静态函数成员可以不定
义对象直接调用,而非静态数据成员只有在定义对象后才分配内存空间,
才能访问。同样道理,静态函数成员不能调用其它非静态函数成员
– 类中的其他函数成员调用静态函数成员直接使用其函数名调用, 调用时不
受权限约束
– 在类外调用静态函数成员需以“类名 :: 静态函数成员名( )”的形式调用,或
通过任何一个该类对象以“对象名.静态函数成员名( )”的形式调用。类外
调用受权限约束,只能调用公有的静态函数成员
– 静态函数成员不能是内联函数,因为编译器在编译时会调整内联函数,此
时所访问的静态数据成员可能还未初始化,因此其数据是不可靠的,此时
访问会导致程序的运行结果出错
这里写图片描述