C++ 类和对象 学习感想

近期,我学习了《类和对象》这一章节。本章节引起我们思考:①实现功能需要什么样的数据、如何组织数据,即:实际问题→涉及哪些数据→如何组织数据→实现方法。②遇到问题,应考虑成是否能定义成数据类型。

下面对书上的知识点进行一下总结:

一、类的定义
1.首先,类是自定义的数据类型,对它所封装的数据实现一些功能。
类的基本思想是数据抽象封装
数据抽象:是一种依赖接口实现分离编程的技术。
类要实现数据抽象和封装,需要先定义一个抽象数据类型
抽象数据类型:由一组数据对这些数据的操作组成。
2.使用C++基本语言定义抽象数据类型,最常见的方式是采用 结构体+全局函数 的方法。其中,结构体用来描述数据,而全局函数则描述对这些数据的操作,数据以参数的形式传递给函数。函数可以把概括性的描述具体化,即把它特例到某一个变量。(在使用时,需要定义一个结构体类型的数据对象。)
3.结构体内的函数被称为成员函数,结构体中的数据被称为数据成员。这样的结构体就被称为类,这种结构体类型的变量就是对象。
类是一种抽象的数据类型,成员函数、数据成员不能够独立使用,必须用结构体类型的变量使用成员函数选择语法来进行调用。而实施调用的这个结构体变量就是成员函数操作的对象。
4.数据成员的类内初始化
数据成员的类内初始值只能放在等号“=”右边,或者放在花括号“{}”里面,不能使用圆括号“()”。
5.成员函数的类外定义
成员函数也可以在结构体内直接定义,但如果内容过长则会影响结构体的可读性。
类外定义如:

struct X{
int a;    		 //定义变量a
void read(); 	 //定义函数read()
};   			 //结构体定义以分号结束
void X::read(){  //成员函数的类外定义
cin>>a>>endl;
}

需要注意的是,成员函数在类外定义时,函数名字前面要加上类名和作用域符“::”,表示这个函数是在其所属的类作用域内,是这个类的成员函数,不同于全局函数。

二、访问控制和封装
1.信息隐藏 访问限定符
public:共有成员声明;
private:私有成员声明,类外不可调用;
protected:被保护成员声明;
如果没有指定访问限定符,struct成员的默认访问限制为public,而class成员的默认访问限制为private。
2.类和对象
封装:将数据和操作捆绑在一起,并且加上访问控制。
对象是客观事物的抽象,类是一组具有相同属性和行为的对象的抽象,对象又称类的实例。外部程序通过类接口中提供的操作访问对象的数据,成为向对象发送消息。同一个类的每个实例都有自己独立的数据,但是可以接收相同的消息。
面向对象编程的主要工作就是创建一组对象并给它们发送消息。发送消息就是调用成员函数,例如s.print()就是向对象s发送一个print()消息。
每个对象都有自己的数据成员,类的成员函数定义并不在各个对象中存储,而是整个类存储一份,本类的所有对象共享这些成员函数的定义。
每个成员函数都有一个隐含的参数,指向接收消息的对象,成为this指针。
this指针在成员函数中最常用于:1)区分与局部变量重命名的数据成员;2)返回当前对象;3)获取当前对象的地址。
例如:

class X{				//用关键词class定义类,类的名字叫X
int m;					//定义数据成员:整型数m
public:					//访问限定符public(),setVal()是公有成员,类的接口
void setVal(int m){		//成员函数setVal(),定义形参m(局部变量)
this->m=m;				//当前对象的数据成员m。m是刚才的形参,把形参m的值赋给数据成员m(此处this用来区分与局部变量重名的数据成员)
}
X& add(const X& a){		//定义函数add(),使其返回类型为X类型的引用,并且将形参声明为X类型的引用,将形参a声明为X类型的const引用
m+=a.m;					//通过变量a引用成员m,并把两个对象相加
return *this;			//*为取内容,此时返回的当前对象变为之前对象加上另一个对象的数据成员值,变为了和对象
}
void copy(const X& a){	//定义无返回值的copy函数,形参类型与上面add函数相同,功能为复制对象
if (this==&a)			//如果当前对象与a是同一对象,就不复制(地址值一样时,这两个对象的值相同)
return;
m=a.m;					//如果不是同一对象,就把a的引用成员m复制给当前对象m
}
};						//结构体定义完加分号

数据成员XX的访问器函数一般命名为getXX,修改器函数名为setXX 。
类的友元可以访问类的私有数据。友元必须在被访问的类中声明。一个类的友元可以是全局函数、另一个类的成员函数或另一个类。类A是类B的友元隐含着A的所有成员函数都是B的友元。friend的关系是不可传递、不可继承的。
三、构造函数和析构函数
1.构造函数:特殊的成员函数,能够在创建对象时被自动调用,负责对象的初始化。构造函数的:1)名字和类名字相同;2)没有返回类型(不是void类型);3)可以重载。构造函数的参数通常为数据成员提供初始值。
一个类的构造函数至少写两个——一个带参数,一个不带参数。
2.引用类型、const数据成员、类类型的数据成员 不能用赋值的方法提供初值。它们的初始化由构造函数初始化列表完成。
成员1(初始值1)[,成员2(初始值2,…)] 在这里,成员和初始值是绑定关系。
初始化列表位于构造函数的参数列表之后,函数体之前:
构造函数(参数表):初始化列表 {函数体}
在初始化列表中,每个成员只能出现一次。成员初始化的顺序与它们在类定义中出现的顺序一致,构造函数初始化列表中初始值的先后关系不会影响实际的初始化顺序。
对象定义:1)类名 对象名; 对象分配了空间,但数据成员没有初始化。2)类名 对象名(实参列表)初始化所有数据成员。
3.析构函数:负责在对象生存期结束时返回相关资源和自动释放资源。
构造函数:1)名字是类名字前加波浪线“~”;2)没有返回类型,也没有任何参数;3)因为不带参数,所以不能重载。
四、const成员
1.如果一个成员函数是非const的,则只有非const对象可以调用它;
const对象不能调用非const的成员函数。
2.如果一个成员函数是const的,则const对象可以调用它;
非const对象也可以调用它,不会改变对象中的成员。
3.允许为一个成员函数定义const和非const两个版本,这两个版本是重载函数。
五、static成员
1.定义函数内部的静态局部对象,改变对象的存储类别。
2.限制名字的可见性。
3.限制数据成员。
4.限制成员函数。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值