C++类和对象

将抽象后的数据和函数封装在一起,构成了C++的‘类’;

1. 面向对象程序设计基本特点

1.1 抽象
 具体的对象进行概况,抽出一类对象的公共性质加以描述的过程。
分类数据抽象和行为抽象,前者是区别彼此类对象的特征,后者描述某类对象共同的行为或功能特征;

1.2 封装
 将抽象的数据和行为相结合,形成一个整体。即将数据和操作函数代码有机结合形成”“;
特点:将一些成员当类和外部的接口,而将其他成员隐蔽起来,达到了对成员访问权限的合理控制,增强了数据安全性和简化了程序编写工作;
封装优点:将数据代码封装成一个可重用的程序模块,在编写程序时有效利用已有的成果,通过外部接口,依据访问规则,使用封装好的程序,而不用了解类内实现细节。

1.3 继承
特殊一般的关系,在一般概念基础上派生出特殊的概念。
继承机制使得原有类的基础上,进行具体化更详细的说明;

1.4 多态
一段程序能够处理多种类型对象的能力。
分类:
(1)强制多态【隐性/显性强制转换】
(2)重载多态【函数重载,操作符重载】
(3)类型参数化多态【函数模板,类模板】
(4)包含多态【虚函数】

2.类和对象

2.1 类
 类对数据的封装隐蔽,对问题的抽象描述,集成度更高,更适合大型复杂程序。

  • 每种数据类型包含数据本身属性和数据的操作。比如int i;i可以进行算数运算和比较运算。
  • 而类就是自定义的数据类型,类实例化为具体的对象;

2.2 类成员访问控制
public:提供对外接口;
protected:与private特性相似,只是继承时区别;
private:只能内部成员函数访问,外部无法访问;

2.3 对象
 类为抽象机制,对象为类的实例或自定义数据类型(类)的变量;

类名 对象名  	//声明对象;
对象名.成员      //访问成员【只可访问公有成员】

对象占用内存只是非静态数据成员,成员函数不在每个对象存储副本,函数代码只占一份空间;

2.4 类的成员函数
2.4.1 类的成员函数实现

返回类型 类名::函数成员名(参数列表)
{
			函数体;
}
//类外实现时,加类名限制;

2.4.2 成员函数调用中的目的对象

myClock.showClock()    //调用时myClock就是目的对象;

2.4.3 带默认形参的成员函数

class Clock
{
public:
	void setTime(int H=0,int M=0,int S=0);
	……
}

2.4.4 内联成员函数
成员函数被反复调用时,可以设置为内联函数;编译时被插入到每个调用的地方。
(1)隐式声明:
直接在类里面写函数实现

class Clock
{
	public:
	 void showTime(){
	 	cout<<hour<<":"<<minute<<":"<<second<<endl;
	 	}
	 	……
}

(2)显示声明
 在类外:

inline void Clock::showTime() {……}

3 构造函数和析构函数

 类对象直接区别(1)对象名本身 (2)对象本身的属性值
在定义对象的时候进行的数据成员设置,叫做对象的初始化。
3.1 构造函数
 对象声明–> 内存分配空间 —> 存放新建的对象---->分配内存空间同时将初值写入
构造函数在对象创建时候利用特定的值构建对象,将对象初始化为一种状态。
性质
(1)和类同名
(2)无返回值,由可以由参数
(3)声明为公有函数
(4)对象被创建时自动调用
分类:
(1)默认构造函数:无需提供参数。编译器隐含地添加地构造函数是为空的状态,如: Clock(){}
(2)带参数的构造函数:自行构造,如果构造了编译器不会自动添加默认构造函数,所以实例化对象时得传对应参数,否则无法解析。如:

Clock(int H, int M, int S){
	hour=H; 
	minute=M;
	second=S;
}

Clock(0,0,0);

(3)复制构造函数
生成一个对象副本:1. 新建对象,原对象成员值一一赋值过来
2. 利用赋值构造函数,利用已有的对象初始化新对象;
调用三种情况:

  • 类的对象去初始化另一个对象时
    Clock a(0,0,0);
    Clock b(a); //同类对象作参数,初始化
    Clock c=b; //等号直接赋值
  • 函数的形参时类的对象,调用函数时,参实结合。【函数传值调用,拷贝新参数,创建了新的p,然后p=a触发拷贝构造函数调用】
    Clock a(0,0,0);
     f(a);
    ……
    void f(Clock p){……}
  • 函数返回值时类的对象,函数执行完返回时【和函数传值类似,函数以值返回,也是将a的值赋给拷贝的一个新的无名临时对像】
    Clock f(){
     Clcok a(0,0,0);
     return a;
    }
    ……
    Clock b;
    b = f();

 编译器提供浅复制,自己写深复制;

3.2 析构函数
对象的消逝关系到对象的生存周期;
析构函数在对象的生存周期将结束时自动调用,完成”善后,清理工作”;
性质
(1)无参数,无返回值
(2)与类同名,前加~

4. 类的组合

 一个类内嵌其他类的对象作成员的情况,关系是包含和被包含。
 类对象被创建时:内嵌对象初始化【按照类内定义时次序】----> 执行类本身构造函数体;
初始化列表:

类名::类名(参数表):内嵌对象1(参数表),内嵌对象2(参数表),……

只能在初始化列表初始化<编写显式构造函数>:
(1)无默认构造函数的内嵌对象,需要初始化传参数;
(2)引用类型的数据成员

【结论】:析构函数和构造函数调用执行顺序相反;


结构体和联合体

struct和class唯一区别:默认访问控制:

struct是public
class是private

union

  1. 不继承,不多态
  2. 对象成员不能自定义构造函数,析构函数,重载复制赋值运算符。
  3. 无名联合体,直接用里面的成员项名字访问;
  4. 全部数据成员共享同一组内存单元
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值