c++学习之 类中的常成员与静态成员

1.类中的所有成员都不能在定义时初始化,只能在构造函数时初始化
2.

#include <iostream>
using namespace std;

class CirclePool // 定义1个圆形水池类CirclePool
{
private:
const double price; // 修改1:声明时使用“const”关键字
double r; // 半径(m)
public:
// 修改2:在构造函数中不能直接对price赋值,改用初始化列表的形式
CirclePool( double p1 = 0, double p2 = 0) : price(p1) { 不能price = p1; r = p2; } // 构造函数
// 修改3:初始化后,不能再设置或修改price,删除函数SetPrice
void SetPrice( double x ) { ...... } // 设置建造单价
double GetPrice( ) { return price; } // 读取建造单价
// ...... 其它代码省略
} ;
int main( ) // 主函数:测算养鱼池工程总造价
{
// ...... 省略此前代码
double r1, r2; cin >> r1 >> r2; // 先输入圆形清水池和污水池的半径r1、r2
CirclePool pool1(10, r1), pool2(10, r2); // 修改4:定义对象时必须初始化常数据成员
pool1.SetPrice( 10 ); // 修改5:不能再设置或修改对象pool1的建造单价
pool1.SetRadius( r1 ); // 可以再设置或修改对象pool1的半径
// ...... 省略此后代码
}

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

3.常函数成员
只能调用类里的数据成员,不能赋值、修改

常函数成员
–内联函数
double GetCost( ) const { return ( 3.14*r*r * price ); }
–非内联函数
double GetCost( ) const ; // 声明
double CirclePool :: GetCost( ) const // 实现
{ return ( 3.14*r*r * price ); }

常函数成员的语法细则
–声明、定义常函数成员需在函数头后面加关键字const进行限定
–常函数成员只能读类中的数据成员,不能赋值修改
–常函数成员只能调用其它常函数成员。换句话说,常函数成员不能调用其它无const限定的函数成员,以防这些函数间接修改了数据成员
–通过常对象只能调用其常函数成员。换句话说,通过常对象不能调用无const限定的函数成员,以防这些函数间接修改了常对象的数据成员
–除形参个数、类型之外,还可以用关键字const区分类中的重载函数

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

#include <iostream>
using namespace std;
class CirclePool // 定义1个圆形水池类CirclePool
{
private:
static double price; // 修改1:声明时使用“static”关键字
double r; // 半径(m)
public:
CirclePool( double p1 = 0 ) { r = p1; } // 修改2:构造函数
// ...... 其它代码省略
} ;
double CirclePool :: price = 10; // 修改3:在类外定义、初始化,定义时加“类名::”
int main( ) // 主函数:测算养鱼池工程总造价
{
// ...... 代码省略
}

静态函数成员:只能访问类中的静态数据成员或调用类中的其他静态函数成员

static double GetPrice( ) ; // 声明
double CirclePool :: GetPrice( ) // 实现
{ return price; }

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

class Math
{
public:
static double pi;
static double sin( double x );
static double cos( double x );
......
} ;
double Math :: pi = 3.1415926;
double Math :: sin( double x ) { ...... };
double Math :: cos( double x ) { ...... };
......
cout << Math :: pi << endl;
cout << Math :: sin(2) << endl;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值