首页 考试吧论坛 Exam8视线 考试商城 网络课程 模拟考试 考友录 实用文档 求职招聘 论文下载 | ||
![]() |
2012中考 | 2012高考 | 2012考研 | 考研培训 | 在职研 | 自学考试 | 成人高考 | 法律硕士 | MBA考试 MPA考试 | 中科院 |
|
![]() |
四六级 | 职称英语 | 商务英语 | 公共英语 | 托福 | 托业 | 雅思 | 专四专八 | 口译笔译 | 博思 GRE GMAT | 新概念英语 | 成人英语三级 | 申硕英语 | 攻硕英语 | 职称日语 | 日语学习 | 零起点法语 | 零起点德语 | 零起点韩语 |
|
![]() |
计算机等级考试 | 软件水平考试 | 职称计算机 | 微软认证 | 思科认证 | Oracle认证 | Linux认证 华为认证 | Java认证 |
|
![]() |
公务员 | 报关员 | 银行从业资格 | 证券从业资格 | 期货从业资格 | 司法考试 | 法律顾问 | 导游资格 报检员 | 教师资格 | 社会工作者 | 外销员 | 国际商务师 | 跟单员 | 单证员 | 物流师 | 价格鉴证师 人力资源 | 管理咨询师 | 秘书资格 | 心理咨询师 | 出版专业资格 | 广告师职业水平 | 驾驶员 网络编辑 | 公共营养师 | 国际货运代理人 | 保险从业资格 | 电子商务师 | 普通话 | 企业培训师 营销师 |
|
![]() |
卫生资格 | 执业医师 | 执业药师 | 执业护士 | |
![]() |
会计从业资格考试(会计证) | 经济师 | 会计职称 | 注册会计师 | 审计师 | 注册税务师 注册资产评估师 | 高级会计师 | ACCA | 统计师 | 精算师 | 理财规划师 | 国际内审师 |
|
![]() |
一级建造师 | 二级建造师 | 造价工程师 | 造价员 | 咨询工程师 | 监理工程师 | 安全工程师 质量工程师 | 物业管理师 | 招标师 | 结构工程师 | 建筑师 | 房地产估价师 | 土地估价师 | 岩土师 设备监理师 | 房地产经纪人 | 投资项目管理师 | 土地登记代理人 | 环境影响评价师 | 环保工程师 城市规划师 | 公路监理师 | 公路造价师 | 安全评价师 | 电气工程师 | 注册测绘师 | 注册计量师 化工工程师 | 材料员 |
|
![]() |
缤纷校园 | 实用文档 | 英语学习 | 作文大全 | 求职招聘 | 论文下载 | 访谈 | 游戏 |
类和对象
看过几本C++的书,关于类和对象的说明大多很繁琐,过于的术语话,直到后来看到一篇“面向对象思想,不看后悔”的网文才算对类和对象有了稍微清晰的了解。摘一小段过来,重温下。
面向对象的编程语言最大的特色就是可以编写自己所需的数据类型,以更好的解决问题。我想我必须要帮你搞清楚“类,对象,属性,方法它们之间的关系”!就像我前面所说的,人这个“类”是什么也做不了的,因为“人类”只是一个抽象的概念,它不是实实在在的“东西”,而这个"东西"就是所谓的对象。只有人这个“对象”才能去工作。而类呢?类是对象的描述!对象从类中产生出来!此时,对象具有类所描述的所有的属性以及方法。
也许你已经有些不知所措了,没关系!好好的回味一下,我再举个例子!例如电视机,电视机都有工作原理图,那么什么叫电视机呢?只要它能够实现工作原理图的所有功能的物体,我们都叫它电视机。你想想是不是这么一回事儿?可是,电视机原理图是不能工作的,也就是这个原理图不能收看节目,只有电视机这个“实体 --即所谓的对象”才能收看节目,也就是说,从类生成出对象之后才算得上是真正的有意义!才能开始工作。此时,电视机拥有电视原理图所描述的所有的属性及方法!明白了吧,呵呵!
我先前介绍过,类是属性与方法的集合。而这些属性与方法可以被声明为私有的(private),公共的(public)或是受保护(protected)的,他们描述了对类成员的访问控制。下面我分别做一下介绍:
1. 公共的(public):把变量声明为公共类型的之后,那么就可以通过对象来直接访问,一切都是暴露无遗的!也就是说,你的信用卡密码别人也能够直接得到。
2. 私有的(private):如果把变量声明为私有的情况就好多了,想要得到我的信用卡密码,对象必须要调用专用的方法才能够得到。
3. 受保护的(protected):介绍继承时再讨论。
为了实现数据的封装,提高数据的安全性,我们一般会把类的属性声明为私有的,而把类的方法声明为公共的。这样,对象能够直接调用类中定义的所有方法,当对象想要修改或得到自己的属性的时候就必须要调用以定义好的专用的方法才能够实现。你想想,你会把你的信用卡密码公布出来嘛?呵呵!所以,我们提倡的是: “对象调方法,方法改属性”;
构造函数与析构函数
构造函数的作用是创建对象的时候对对象做初始化工作,也就是给用户提供类的成员变量的初始化的一种方式。这同时也包含了内存分配,我觉得这点最重要。
如果程序设计人员自己不定义构造函数的话,编译器会在下列三种情况下提供默认构造函数。
如果类有虚拟成员函数或者虚基类;
如果基类有构造函数或者编译器提供的默认构造函数;
在类中所有的非静态的数据成员,它们所属的类有构造函数或者编译器提供的构造函数。
1和2好理解些,3?类的数据成员所属别的类,那不就是存在继承关系,和2是一个意思?搞不懂。
当一个对象的生命周期完成时,调用析构函数释放对象所占有的资源。析构函数不容许带参数,一个类中也只有一个析构函数,但是可以在析构函数中添加代码,比如动态分配的指针对象所指向的数组。
函数的重载
在同一个类中,函数名相同,参数个数或类型不同,才可以构成函数的重载,只有返回值的类型不同不能构成函数重载。
int output(int a,int b=5);
int output(int a);
上面两个函数符合函数重载的条件,但是当调用output(8)时,由于第一个有默认参数,会出现歧义,所以函数重载的时候要注意默认参数这种情况。
this指针
上代码
#include
class point
{
public:
int x;
int y;
point()
{
x=0;
y=0;
}
point(int a,int b)
{
x=a;
y=b;
}
void input(int x,int y) // input(int q,int w)
{
x=x; //x=q
y=y; //y=w
}
void output()
{
cout《"x="《x《"y="《y《endl;
}
};
void main()
{
point pt(5,5); //调用构造函数,将x,y初始化为5
pt.input(10,10); //调用input函数,将x,y赋值为10???
pt.output();
}程序运行之后,变量x,y的初始化工作是正常的,但是赋值失败,书中给出的解释是由于变量的可见性,x,y在input(int x,int y)这个函数中是不可见的。但是把input(int x,int y)形参换成非x,y就可以了,修改代码,测试下果然可以。
这里便有一疑问,既然x,y在input(int x,int y)这个函数中是不可见的,那么即使换了一个形参,也应该是不可见的,个人感觉点地方应该这么来解释
void input(int x,int y) {
x=x;
y=y;
}
没有将形参x,y的值赋给类的成员变量x,y并不是因为x,y的可见性,同一个类中的变量不存在不可见性的问题,而是input函数中的x,y 相当与两个局部变量,巧合的是和成员变量同名,作用域的优先级高于成员变量(在css样式表中会这样),于是此函数的功能为形参的自我赋值。
回到this指针,每个对象在创建时都会有一个隐含的this指针指向对象本身。将函数修改为
void input(int x,int y) {
this.x=x;
this.y=y;
}
由于this指针指向对象本身,当然可以通过this指针指向对象的独有的数据成员,并完成赋值工作。
Ps:又是指针,shit!
相关推荐:
北京 | 天津 | 上海 | 江苏 | 山东 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
广东 | 河北 | 湖南 | 广西 | 河南 |
海南 | 湖北 | 四川 | 重庆 | 云南 |
贵州 | 西藏 | 新疆 | 陕西 | 山西 |
宁夏 | 甘肃 | 青海 | 辽宁 | 吉林 |
黑龙江 | 内蒙古 |