《c++语言程序设计》笔记(三)

本文探讨了C++中对象的生存期管理,包括静态与动态生存期的区别,以及如何利用静态数据成员和静态成员函数进行类级别的数据共享。同时介绍了友元机制,并讨论了通过常对象、常成员函数等手段保护共享数据的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第五章 数据的共享与保护

对象的生存期
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 停止编译并显示错误信息
3、defined操作符
形式:defined(操作符)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mypollyanna

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值