第五章 数据的共享与保护
对象的生存期
1、静态生存期:对象的生存期与程序的运行期相同,使用关键字static(没有赋初值则默认为0)
2、动态生存期:块执行完毕后不可见(未赋初值则会随机赋值)
静态数据成员
1、不属于任何一个对象,因此可以通过类名对它进行访问。
2、类的静态数据成员需要在类定义之外再加以定义,因为需要以这种方式专门为它们分配空间。
静态函数成员
1、静态成员函数可以通过类名或对象名来调用,而非静态成员函数只能通过对象名来调用。
2、静态成员函数可以直接访问该类的静态数据和函数成员,而访问非静态成员,必须通过对象名。
#include<iostream>
using namespace std;
class Point{
public:
Point(int x=0,int y=0):x(x),y(y){count++;}
//在构造函数中对count进行累加,所有对象共同维护一个count
Point(Point &p){
x=p.x;
y=p.y;
count++;
}
~Point(){count--;}
int getX(){return x;}
int getY(){return y;}
static void showCount(){
cout<<" Object count="<<count<<endl;
}
private:
int x,y;
static int count;
};
int Point::count=0;
int main()
{
Point a(4,5);
cout<<"Point A:"<<a.getX()<<","<<a.getY();
Point::showCount();
Point b(a);
cout<<"Point B:"<<b.getX()<<","<<b.getY();
Point::showCount();
return 0;
}
友元关系提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。
友元类的所有成员函数都自动成为友元函数。
友元函数:当一个函数作为类的成员函数不妥或者影响程序的可读性时,就需要在类外定义一个一般函数,但它与该类有特殊的关系,这就是友元函数的意义。友元函数应该声明在类中,但不作为类的成员函数。
友元函数不仅可以是一般函数,它还可以是另外一个类的成员函数。友元成员函数需要通过相应类或对象名来访问。
友元类的特点:
1、不能传递
2、单向(即若声明B类是A类的友元,则B类的成员函数就可以访问A类的私有和保护数据,但A不能访问B的)
3、友元关系不被继承
共享数据的保护
1、常对象:必须进行初始化,且不能被更新;不能通过常对象调用普通的成员函数,而只能调用它的常成员函数
2、常成员函数:调用期间,目的对象都被视同为常对象,保证了在常成员函数中不会改变目的对象的数据成员的值;可用于对重载函数的区分,例如:
void print();
void print() const;
即为一个有效重载。
对于无需改变对象状态的成员函数,我们都应当使用const。
3、常数据成员:只能通过初始化列表来获得初值
注意:类的静态常量如果具有整数类型或枚举类型,那么可以直接在类定义中为它指定常量值。如:
static const int b=10;
4、常引用:所引用的对象不能被更新
编译预处理命令
1、#define和#undef指令
① #define可以定义符号常量,例如:
#define PI = 3.14
② c语言中,可以用#define来定义带参数宏,实现简单的函数计算,c++中被内联函数取代
③ #define定义空符号,例如:
#define MYHEAD_H,表示MYHEAD_H已经定义过,用于与条件编译指令一起使用
④ #undef的作用是删除由#define定义的宏
2、条件编译指令
可以限定程序中的某些内容要在满足一定条件的情况下才参与编译,使同一个源程序在不同的编译条件下产生不同的目标代码
指令 用途
# 空指令,无任何效果
#include 包含一个源代码文件
#define 定义宏
#undef 取消已定义的宏
#if 如果给定条件为真,则编译下面代码
#ifdef 如果宏已经定义,则编译下面代码
#ifndef 如果宏没有定义,则编译下面代码
#elif 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码,其实就是else if的简写
#endif 结束一个#if……#else条件编译块
#error 停止编译并显示错误信息
# 空指令,无任何效果
#include 包含一个源代码文件
#define 定义宏
#undef 取消已定义的宏
#if 如果给定条件为真,则编译下面代码
#ifdef 如果宏已经定义,则编译下面代码
#ifndef 如果宏没有定义,则编译下面代码
#elif 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码,其实就是else if的简写
#endif 结束一个#if……#else条件编译块
#error 停止编译并显示错误信息
3、defined操作符
形式:defined(操作符)