C++之类和对象的特性
简介:C++并不是一个纯粹的面向对象的语言,而是一种基于过程和面向对象的混合型的语言。
凡是以类对象为基本构成单位的程序称为基于对象的程序,再加上抽象、封装、继承和多态就成为面向对象程序。
1.掌握类的概念、类的定义格式、类与结构的关系、类的成员属性和类的封装性;
2.掌握类对象的定义;
3.理解类的成员的访问控制的含义,公有、私有和保护成员的区别。
4.能够根据给定的要求定义类并实现类的成员函数;
何为对象?
对象两要素:属性和行为;
属性对应于对象的数据;行为对应于函数;
对象之间可以通过一定的渠道相互联系;要使某一个对象实现某一种行为(操作),应当向它传送相应的消息。
封装与信息隐蔽
可以对一个对象进行封装处理,把它的一部分属性和功能对外屏蔽,外界看不到,甚至不可知;这就是封装。
所谓封装有两方面的含义:一是将有关数据和操作代码封装在一个对象中,形成一个基本单位,各个对象之间相互独立,互不干扰;二是将对象中的某些部分对外隐蔽,即阴部内部细节,保留少量接口,以便与外界联系,接受外界信息。信息隐蔽有利于数据安全,防止无关的人了解和修改。
抽象:表示同一类事物的本质;类是对象的抽象,对象是类的特例,即类的具体表现形式;
继承和软件重用
多态
如果有几个相似而不完全相同的对象,有时要求在向它们发出同一个消息时,它们的反应各不相同,分别执行不同的操作,这种现象就是多态;
由继承而产生的不同的派生类,其对象对同一消息会作出不同的响应。增加程序的灵活性;
面向对象程序的特点
区别于基于过程程序设计是围绕功能进行的,用一个函数实现一个功能。而面向对象程序设计面对的是一个个对象。把数据和有关操作封装成一个对象。
程序设计者的任务包括两个方面:
一是对所需的各种类和对象进行设计,即决定把哪些数据和操作封装在一起;
二是考虑怎样向有关对象发送消息,以完成所需的任务;
结构化程序设计:程序=算法+数据结构
面向对象程序设计:程序=对象s+消息 (对象=算法+数据结构)
类的声明和对象的定义
类是抽象的,不占用内存;而对象是具体的,占用内存空间;
类的声明参考 结构体的声明;C语言结构体的定义和使用
类的成员访问限定符:private/public/protected
private只能被本类中的成员函数引用,类外不能调用(友元类除外);默认为私有的;
public既可以被本类中的成员函数引用,也可被类的作用域内的其他函数引用,外界可调用;
protected它不能被类外访问,但可以被派生类的成员函数访问;
一般先写public部分,再写private私有部分;
类的定义方法
1/2/3
类和结构体的异同
由于C++是在C的基础上发展的,因此C++保留了C的特性;由于C++类具有C中结构体的特性;因此结构体和类均可以声明类;
区别是:用struct声明的类,系统默认其数据成员public;
类的成员函数
可以是private/public
在类外定义成员函数
在类体中声明成员函数,在类外进行定义。
class student
{
public:
void display(); // 函数声明
private:
int num;
char sex;
};
void Student::display( ) //函数体
{
cout<<"num:"<<num<<endl;
}
::作用域限定符,声明函数是属于哪个类的。
类函数必须先在类体中作原型声明,然后在类外定义;
如果一个函数体只要两三行,一般可在类体中定义;
多于三行的函数,一般在类体内声明,在类外定义;
内置成员函数 inline
在类体中定义的成员函数一般较小,而系统调用函数的过程所花费的时间开销相对是比较大的。
调用一个函数的时间开销远远大于小规模函数体中全部语句的执行时间;
为了减小时间开销,如果在类体中定义的成员函数不包括循环等结构,C++系统自动地对它们作为内置函数来处理;
在程序调用这些函数时,并不是真正的执行函数的调用过程,而是把函数代码嵌入程序的调用点。
对于类内定义的成员函数,可以省略inline;
对于在类外定义的成员函数,系统并不把它默认为内置函数;需要在声明时用inline作显式声明;二者其一均可(声明/定义时候);
如果在类体外定义inline函数,则必须将类定义和成员函数的定义都放在同一个头文件中(写在同一个源文件中),否则编译时无法进行置换。
只有在类外定义的成员函数规模很小且调用频率较高时,才指定位内置函数;
成员函数的存储方式
同一类的不同对象中的数据成员的值一般是不相同的,而不同对象的函数的代码是相同的,不论调用哪一个对象的函数的代码,其实调用的都是同样内容的代码;
C++类中的每个对象所占用的存储空间只是该对象的数据成员所占用的存储空间,而不包括函数代码所占用的存储空间;只取决于对象中数据成员所占用的空间,与成员函数无关;
不同对象使用同一个函数代码段,它怎么能分别对不同对象中的数据进行的操作呢? this指针,当调用哪个对象中的函数,this指针就指向哪个对象;
注意:1)不论成员函数在类内定义还是在类外定义,成员函数的代码段的存储方式是相同的,都不占用对象的存储空间;
2)不要将成员函数的这种存储方式和inline函数的概念混淆;inline只影响程序的执行效率,与存储方式无关;
3)从逻辑角度看成员函数,从物理角度看成员函数的存储方式;
对象成员的引用
通过对象名和成员名运算符访问对象中的成员;在类外只能访问public成员;
通过指针
通过引用
类的封装和信息隐蔽性
公用接口和私有实现的分离
在声明类时,一般都是把所有的数据指定位私有的,使它们与外界隔离,把需要让外界调用的成员函数指定位公开的,在类外虽然不能直接访问私有数据成员,但可以通过调用公用成员函数来引用甚至修改私有数据;
class student
{ private:
int num;
char sex;
string name; // 此行时新增的
public:
void Student::display( ) //函数体
{
cout<<"num:"<<num<<endl;
cout<<"name:"<<name<<endl; //此行新增的
}
};
当接口与实现(对数据的操作)分离时,只要类的接口没有改变,对私有实现的修改不会引起程序的其他部分的修改;
C++之类和对象的特性的更多相关文章
- 利用js对象的特性,去掉数组中的重复项
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- js 中对象的特性
用Object.definedproperties 一次性添加或修改多个属性的特性和值. <script> var obj ={} Object.defineProperties(obj, ...
- js 中对象属性特性的描述
如何自定义属性的特性? 用对象.属性的特性和自定义的属性的特性有什么区别? 它的四大特性 writable enumerable configable 有什么区别? 先预习一个用对象.属性 ...
- javaSE_07Java中类和对象-封装特性
一.谈谈什么是面向对象的思维 理解面向对象,重点是要思考以下的问题 面向过程 vs 面向对象 Ø 谈谈什么是面向过程的编程思想? Ø 为什么有面向过程还要有面向对象? Ø 谈谈什么是面向对象的编程思想 ...
- PHP------面向对象的特性
面向对象的特性 一.面向对象有三大特性: 封装.继承.多态.(非常重要,第一要记住!!!!!!!!!!) 二.封装 封装就是用来做类的,把一个类封装起来.做类不能随便的做.我们做类不能随便去写一个类, ...
- ECMA5中定义的对象属性特性和方法
ECMA5规定了只有内部才有的特性,描述了属性的各种特征,这些特性用于实现JavaScript引擎,因此在Js中不能直接访问他们.为了标识特性,我们一般会他们放入两对方括号中. ECMAScript中 ...
- 编写一个Animal类,具有属性:种类;具有功能:吃、睡。定义其子类Fish 和Dog,定义主类E,在其main方法中分别创建其对象并测试对象的特性。
package animal; public class Animal { //成员属性 private String kind; public String getKind() { return k ...
- js 中对象属性特性2
对象的存储描述: get 和 set 方法 <script> var obj ={ get age(){ return 22 }, set age(value){ console. ...
- C++面向对象程序设计之类和对象的特性
类和对象的属性 注意:本文为书籍摘要版,适合有一定程序基础的人阅读. 2.1 面向对象程序设计方法概述 2.1.1 什么是面向对象的程序设计 1.对象 客观世界中的任何一个事物都可以看成一个对象. 如 ...
随机推荐
- Utils使用
获取两个时间之间的天数 var startDate = new Date(_startDate).getTime(); var endDate = new Date(_endDate).getTime ...
- 5 python 内置类
1.实例属性和类属性 给实例绑定属性的方法是通过实例变量,或者通过self变量: class Chinese: def __init__(self,name,sex,age): self.name = ...
- C#连接sqlserver windows 和 sqlserver 身份验证的两种连接字符串
//sql server 身份验证 连接字符串 private string ConnstrSqlServer = "server=服务器名称;uid=登录名称;pwd=登录密码;datab ...
- AMD 与CMD
AMD AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义".它采用异步方式加载模块,模块的加载不影响它后面 ...
- VC中使用ADO操作数据库的方法
源地址:http://blog.csdn.net/xiaobai1593/article/details/7459862 准备工作: (1).引入ADO类 #import "c:\progr ...
- 漫谈四种神经网络序列解码模型【附示例代码】 glimpse attention
漫谈四种神经网络序列解码模型[附示例代码] http://jacoxu.com/encoder_decoder/ [视觉注意力的循环神经网络模型]http://blog.csdn.net/leo_xu ...
- The Hard Thing About Hard Things
1.大多数的管理书籍都是告诉你如何做正确的事,不把事情搞砸.而好书是告诉你,当事情已经搞砸时,你该怎么办. 2.这是个个真实的世界,他们偷走了你的梦想,可你却不知道是谁偷的.
- selenium -- 鼠标悬停
针对页面上的二级菜单,需要鼠标悬停才能进行操作. /** * Clicks (without releasing) in the middle of the given element. This i ...
- forward(请求转发)和redirect(重定向)的区别
原理: forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原 ...
- SVN服务器的安装和使用
------------------siwuxie095 SVN 服务器的安装 1.SVN 服务器,选择 VisualS ...