C++类与对象:指针、静态、参数、常、友元与组合等概念

类类型作为函数参数

三种方式

  • 对象本身作为参数
    - C++采用传值的方式传递参数,因此使用对象本身参数时,形参是实参的一个拷贝。

  • 对象引用作为参数
    - 这种方式比对象本身参数或对象指针参数都要容易理解和使用,并且没有副作用。

  • 对象指针做参数
    - 对象指针指向实参对象,通过间接方式访问和修改它所指向的对象,实际上就是访问和修改实参对象。

对象数组

对象数组Clock clock[10];//类似结构体

数组初始化
  • 显式初始化数组元素
    - const unsigned arr_size=3;
    - int ia[arry_size]={0,1,2};
  • 隐式初始化
    - 在函数体外(全局变量)定义的内置数组,元素均为0;
    - 函数体内定义的内置数组,元素无初始化;
    - 若元素类型为类类型,无论在哪里定义,则自动调用该类的默认构造函数进行初始化。如果该类没有默认构造函数,则必须为该数组的元素提供显式初始化。
对象数组的初始化
  • 对象数组的初始化过程,实际上就是调用构造函数对每一个数组元素进行初始化的过程。
  • 如果在声明数组时给出每一个数组元素的初始值,在初始化过程中就会调用最匹配的构造函数。
  • 对象指针的加减操作也可以快速访问对象数组元素

静态成员

  • 关键字static
    - 数据成员
    - 函数成员
数据成员
  • 定义静态数据成员
class example
{
		int value;
	public:
		static int value_1;//在类内声明静态数据成员
};
int example::value_1=5;//在类外定义静态数据成员,在定义时给初值
静态数据成员的特点
  • 同C语言静态数据
  • 类的所有对象共享静态数据成员的存储空间
int main()
{
	example a,b,c,d;
	return 0;
};//a,b,c,d都有自己的value和value_1,value存储空间不共享,value_1的存储空间共享
静态数据成员的使用
  • 静态数据成员也有public和private的区别
  • 由于静态数据成员是属于类的,因此在类外按如下形式访问public静态数据成员:
example::value_1;
  • 当类对象不存在时,也可以访问类的静态数据成员。
函数成员
  • 定义静态成员函数
class example
{
	public:
		static void show_value(){......};
};
  • 静态成员函数只属于一个类,它没有this指针。
  • 静态成员函数可以使public或者private

常对象与常成员(const)

  • 如果某个对象不允许被修改,则该对象称为常对象。C++用关键字const来定义常对象。
  • const也可以用来限定类的数据成员和成员函数,分别称为类的常数据成员和常成员函数。
  • 常成员函数不能更新对象的数据成员,也不能调用该类中没有用const修饰的成员函数。
  • 常对象只能调用它的常成员函数,而不能调用其他成员函数。
  • const关键字可以用于参与重载函数的区分。
class Date
{
	private:
		int Y,M,D;
	public:
		int year() const;
		int month() const;
		int day() const {return D;};
		int day(){return D++;}
		int AddYear(int i){return Y+i;};
};
int Date::month(){return M;}//错误,常成员函数实现不能缺少const
int Date::year()const{return Y++;}//错误:常成员函数不能更新类的数据成员
Date const d1;
int j=d1.year();//正确
int j=d1.AddYear(10);//错误:常对象不能调用非常成员函数
Date d2;
int i=d2.year();//正确
d2.day();//正确,可以正确区分的重载

友元

  • 一个对象的私有成员只能被自己的成员访问到。当类外的对象或者要访问这个类的私有成员时,只能通过该类提供的公有成员间接的进行。
    这个方法通过函数调用实现,效率不高。

  • C++提供了友元来打破私有化界限,即一个类的友元可以访问到该类的私有成员。

  • 友元不具有对称性,X是Y的友元,但是Y不一定是X的友元。

  • 友元不具备传递性。

友元函数
class Point
{
	......
	friend flaot Distance(Ponit a,Ponit b);//声明友元函数,Distance可以访问类Point中的Private
}
int main()
{
	......
	float d=Distance(float a,float b);//直接访问Point中的Private
}
  • 友元函数的声明可以放在类的任何位置
  • 友元函数可以直接访问私有成员
  • 友元函数和普通函数一样,可以直接调用友元函数
  • 友元函数不属于任何类,因此友元函数没有this指针
友元类
  • 友元类的特点:类Y中的所有成员函数都成为类X的友元函数,都能直接访问类X中所有的成员
class Y{......};
class X
{
	......
	friend class Y;
};//Y的类对象可以直接访问X的成员
//在使用时,如果Y的声明在X后,则需要在X类前加前向说明
class Y;//前向说明
class X{
	......
	friend class Y;
};
class Y{......};
将成员函数说明为另一个类的友元函数
Class X;//前向说明
class Y
{
	public:
		void SetX(X &obj,int v);
		......
};
class X
{
	......
	friend void Y::SetX(X &obj,int v);//Y的函数SetX可以访问X的私有成员
};
void Y::Set(X &obj,int v){obj.x=x};

组合类

当一个类很复杂时,我们可以拆分成很多子类,将子类实现后可以组合成一个复杂类。

  • 一个类的对象作为另一个类的成员,这体现的时整体和部分的关系,即对象的包含关系,这个作为成员的对象被称为子对象。
  • 若子对象对应的类的构造函数有参数,那么包含该子对象的类必须使用表达式的方式先初始化子对象。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值