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;  //此行新增的
}
};

当接口与实现(对数据的操作)分离时,只要类的接口没有改变,对私有实现的修改不会引起程序的其他部分的修改;

时间: 2024-10-30 21:39:34

C++之类和对象的特性的相关文章

第八章 类对象的特性

第八章 类对象的特性 面向对象程序设计有4个主要特点:抽象.封装.继承和多态. 任何对象都应当具有两个要素,即属性和行为.对象是由一组属性和一组行为构成的. 1.类的声明和对象的定义 *类是对象的抽象,对象是类的具体实现. *类的声明: class 类名{ 成员属性:成员:... } *对象的定义:与普通类型相同: 2.类的成员函数 *成员函数的性质:public,protected,private *类外定义成员函数:(要体现作用域)函数类型 类名::函数名(参数表){函数体:} *内置成员函

利用js对象的特性,去掉数组中的重复项

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Unt

PHP------面向对象的特性

面向对象的特性 一.面向对象有三大特性: 封装.继承.多态.(非常重要,第一要记住!!!!!!!!!!) 二.封装 封装就是用来做类的,把一个类封装起来.做类不能随便的做.我们做类不能随便去写一个类,随便写一个类之后,别人可以在外界,通过对象就可以直接调用我们里面的成员,直接操作我们里面的成员,这样的话对于我们的类来讲,如果外界的直接操作我们的成员,那我们的这个类的安全性就低了,就说明我们做的这个类不安全了,外界可以随便访问,就不安全了,另外,类如果随便写写,直接拿对象直接调用,里面的成员属性或

python基础-对象高级特性

一.实例绑定: 二.使用__slots__: 三.@property:python内置装饰器 decorator 四.多重继承:Mixin 五.定制类: 1. __str__ 和 __repr__: 打印一个实例 2. __iter__: 被用于 for ... in循环 3.__getitem__ :现得像list那样按照下标取出元素,需要实现__getitem__()方法 4.__getattr__ : 动态返回一个属性 5.__call__ : 对实例本身进行调用 六.使用元类:metac

js 中对象的特性

用Object.definedproperties 一次性添加或修改多个属性的特性和值. 1 <script> 2 var obj ={} 3 Object.defineProperties(obj,{ 4 x:{value:1,writalbe:true,configurable:true,enumerable:true}, 5 y:{value:2,configurable:true} 6 }) 7 console.log(obj.x) //=>1 8 console.log(obj

OC--面向对象三大特性

面向对象三大特性: 成员变量的封装.继承.多态 封装: /* set方法: 1.作用:提供一个方法给外界设置成员变量 2.命名规范: 1>方法名必须以set开头 2>set后面跟上成员变量的名称,成员变量的首字母必须大写 3>返回值一定是void 4>一定要接受一个参数,而且参数类型跟成员变量类型一致 5>形参的名称不能跟成员变量名一样 */ - (void)setAge:(int)newAge; /* get方法: 1.作用:返回对象内部的成员变量 2.命名规范: 1>

python学习面对对象三大特性

一. 继承 1. 单继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类. 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制. 如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如__str__)的实现 语法: class 派生类名(基类名) ............. 子类以及子类实例化的对象,可以访问父类的任何

js 中对象属性特性2

对象的存储描述: get   和   set 方法 1 <script> 2 var obj ={ 3 get age(){ 4 return 22 5 }, 6 set age(value){ 7 console.log(value) 8 } 9 } 10 console.log(obj.age) 11 obj.age = 23 12 13 var obj1 ={ 14 x:1, 15 y:2, 16 z:3, 17 get zhouchang(){ 18 return this.x+thi

编写一个Animal类,具有属性:种类;具有功能:吃、睡。定义其子类Fish 和Dog,定义主类E,在其main方法中分别创建其对象并测试对象的特性。

package animal; public class Animal { //成员属性 private String kind; public String getKind() { return kind; } public void setKind(String kind) { this.kind = kind; } //成员方法 public void eat() { } public void sleep() { } } package animal; public class Fish