在面向过程的设计中,程序的模块是函数构成的,而面向对象设计中程序模块是类构成的。函数只是语句和数据的封装,而类是函数与数据的封装,对比下肯定是面向对象设计更重量级了,更适合大型程序的开发。

其实,类就是一种自定义数据类型,跟一般的类型如int、char等有很多相似之处。我们可以定义int型的变量,同样也可以定义某个类类型的变量,用类定义的变量叫做类的对象,这种定义对象的过程叫做实例化。

类的声明

类声明的语法形式如下:

class 类名称
{public:公有成员(外部接口)
protected:保护型成员
private:私有成员
}

当然,这里的public、protected和private关键字可以任意换顺序,比如先声明私有成员再声明其他的也可以,每个关键字也可以出现多次,比如声明一些public的成员,后面又出了个public声明了另一些成员,也是可以的,但是一般我们还是按照上面的形式来声明类。

这里还是拿时钟当例子,声明一个类来描述时钟:

class  Clock
{public:                                                                              void SetTime(int NewH,int NewM,int NewS);      void ShowTime();
private:                                                              int  Hour,Minute,Second;
};

类Clock封装了时钟的数据和行为,分别叫Clock类的数据成员和函数成员。在类的声明中只声明函数的原型,函数的实现也就是函数体可以在类外定义,当然也可以写在类声明里,那样就成为隐式声明的内联函数。下面是在类外写函数实现的方式:

void Clock::SetTime(int NewH, int NewM, int NewS)
{Hour=NewH;Minute=NewM;Second=NewS;
}
void Clock::ShowTime()
{cout<<Hour<<":"<<Minute<<":"<<Second<<endl;
}

注意:函数名前面要加上它所属的类,用来说明它属于哪个类。

这样就完成了Clock类的声明。首先用关键字class声明类的名称Clock,然后说明Clock类的数据成员和函数成员,通过public、private关键字来说明类成员的访问控制属性,最后给出成员函数的实现。

类成员的访问控制

我们再通过时钟来看看访问控制机制。正常使用时我们只能通过时钟面板来看时间,通过按钮或旋钮来调整时间,所以,面板和按钮或旋钮就是时钟的外部接口,时钟类Clock的SetTime和ShowTime就是Clock类的外部接口。

除了这样使用时钟,我们不能拆开时钟在内部直接改时间,那样会弄坏时钟的,所以时钟的时间是私有成员,Clock类的Hour、Minute、Second都是其私有成员,外部不能直接访问,只能通过外部接口来访问。

类成员访问权限的控制是通过设置成员的访问控制属性来实现的。访问控制属性有三种:公有类型(public)、私有类型(private)和保护类型(protected)。

公有类型声明了类的外部接口。公有类型成员用public关键字声明。外部访问必须通过外部接口进行。

比如,对于Clock类,外部想查看或改变时间只能通过SetTime和ShowTime两个公有类型的函数实现。

private后面声明的是类的私有类型成员。如果没有标明访问控制属性则默认为private。

比如,类Clock声明中,如果那个public没有的话,那么SetTime和ShowTime函数就都默认是private的。私有类型成员只能由本类中的成员函数访问,外部不能访问。Clock类中Hour、Minute、Second都是私有类型成员。

保护类型的成员和私有类型成员权限相似,差别就是某个类派生的子类中的函数能够访问它的保护成员,这个后面会讲到。

类的成员函数

函数原型的声明要写在类主体中,原型说明了函数的参数类型和个数及返回值类型。而函数的具体实现是类声明之外的,但是跟普通函数不同的是,写函数实现时要在前面加上类名,指明所属的类。具体的形式为:

返回值类型  类名::函数成员名(参数表)
{函数体
}

类的成员函数也可以由默认参数值,它的调用规则跟之前讲的普通函数相同。

类的比较简单的成员函数也可以声明为内联函数,和普通内联函数一样,编译时也会将内联函数的函数体插入到每个调用它的地方。内联函数的声明有两种方式:隐式声明和显式声明。

把函数体直接放到类主体内,这种方式就是隐式声明。比如,将时钟类的ShowTime声明为内联函数,可以写成:

class  Clock
{public:                                                                             void SetTime(int NewH,int NewM,int NewS);       void ShowTime(){ cout<<Hour<<":"<<Minute<<":"<<Second<<endl; }
private:                                                              int  Hour,Minute,Second;
};

对象

类的对象就是具有该类类型的特定实体。就像一般类型的变量一样,类是自定义数据类型,对象就是该类类型的变量。声明一个对象和声明变量的方式是一样的: 类名 对象名;

比如,声明一个时钟类的对象:Clock myClock;。声明了对象后就可以访问对象的公有成员,这种访问需要采用“.”操作符,调用公有成员函数的一般形式是:对象名.公有成员函数名(参数表),访问公有数据成员的形式是:对象名.公有数据成员。当然,一般数据是私有类型的,但是也不排除有时是公有类型的。

例如,可以用myClock.ShowTime()的形式访问对象myClock的成员函数ShowTime()。

#include<iostream>
using namespace std;
// 第一部分
class Clock
{public:                                                                             void SetTime(int NewH,int NewM,int NewS);      void ShowTime();
private:                                                             int  Hour,Minute,Second;
};
// 第二部分
void Clock::SetTime(int NewH, int NewM, int NewS)
{Hour=NewH;Minute=NewM;Second=NewS;
}
void Clock::ShowTime()
{cout<<Hour<<":"<<Minute<<":"<<Second<<endl;
}
// 第三部分
int main()
{   Clock  myClock;myClock.SetTime(8,30,30);myClock.ShowTime();return 0;
}


本程序就像注释的那样可以分为三个比较独立的部分,第一个部分是类Clock的定义,第二个部分是成员函数的具体实现,第三个部分是主函数main。

类的声明、成员的访问控制和对象相关推荐

  1. abstract类中不可以有private的成员_C++ 类:声明成员函数与实现

    接上文... 16.3类的成员 2.成员函数 1.构造函数 ... 2.拷贝构造函数 有了类的构造函数我们就可以创建类的实例了,下图中分别使用不同的构造函数一共创建了4个动物的对象,现在程序中就有4个 ...

  2. 声明一个Tree(树)类,有成员ages(树龄),成员函数grow(int years)用以对ages 加上years,showage( )用以显示tree对象的ages值。在主函数中定义Tree类对

    //声明一个Tree(树)类,有成员ages(树龄), //成员函数grow(int years)用以对ages 加上years //,showage()用以显示tree对象的ages值. //在主函 ...

  3. 派生类对基类成员的访问控制之公有继承

    公有继承 前面说过,派生类从基类继承时有三个步骤, 第一个步骤是吸收基类成员,吸收了基类中除构造函数和析构函数之外的所有数据成员和函数成员, 第二个步骤就是修改基类成员,包括修改对基类成员的访问属性和 ...

  4. C++>继承,继承方式及其比较,子类和父类对象指针,派生类的默认成员函数,虚继承,继承与友元,继承与静态成员

    继承 继承的概念与定义 概念: 继承是指一个子类(或称为派生类)继承父类(或称为基类)的特征(属性和操作).继承是面向对象程序设计时实现代码复用的重要手段,它允许在原有的类的基础上进行扩展,增加功能, ...

  5. c++中delete对象后 调用成员函数_C++类的特殊成员函数及default/delete特性

    本文包含以下内容 1. C++的四类特殊成员函数介绍,重点介绍拷贝构造函数和拷贝复制运算符 2. C++11中的default/delete特性 本文内容侧重个人理解,深入理解其原理推荐https:/ ...

  6. “CObject::operator =”: 无法访问 private 成员(在“CObject”类中声明)

    c++工程编译报错: "CObject::operator =": 无法访问 private 成员(在"CObject"类中声明) 错误无法直接定位源码位置,网 ...

  7. C++ 类的知识 | 构造函数再探、匿名对象、友元函数、内部类、类的const成员、类的static成员

    文章目录 构造函数再探 以下代码共调用多少次拷贝构造函数 委托构造函数 概念 形式 匿名对象 友元 友元的声明 友元类 令成员函数作为友元 函数重载和友元 注意 内部类 特性 类的const成员 可变 ...

  8. C++ 类与对象_类的其他成员(常成员,静态成员,友元)

    系列文章目录 重新复习c++,所以把书中的重点内容整理成博客,尽量简洁,易懂. C++ 类与对象_类和对象的定义与访问 (定义类和对象,访问对象成员,this指针) C++ 类与对象_构造函数和析构函 ...

  9. C++的成员函数声明与定义 —— 类外定义成员函数以及inline函数

    作者原文:https://www.cnblogs.com/wuchanming/p/4061654.html 类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它 ...

最新文章

  1. 全球大半网络瘫痪,背后原因竟来自这家无名小公司
  2. python提取网页数据
  3. linux 搭建mysql主从复制 ----第一篇
  4. php中extends是什么意思,在php中extends与implements的区别
  5. 黑客还是间谍?让你惊出一身冷汗的10个社会工程学黑客攻击手段
  6. html 字符串最后加空格,js给字符串每个字符中间加空格
  7. 中高级数论 [欧拉函数线性筛,二次剩余]
  8. 启动weblogic需要账号密码问题
  9. 通过地址访问 mysql_MySql通过ip地址进行访问的方法
  10. Django-session的存放位置
  11. 如何高效地学习机器学习算法?
  12. WPF中DataGrid的使用实例
  13. 计算机网络10--路由冗余备份,缺省(静态)路由配置
  14. 笔记1-P2P后台管理系统
  15. C++实现进程通信(管道pipe)
  16. 7.中文句法依存分析
  17. android 高仿 猿题库,猿题库(com.fenbi.android.gaozhong) - 9.17.2 - 应用 - 酷安
  18. SQL Server 数据库修复步骤
  19. 55个经典开源Windows工具
  20. tp5中渲染页面将时间戳转换为日期时间格式(Y-m-d H:i:s)

热门文章

  1. Win-MASM64汇编语言-DUP/TIMES
  2. Win-MASM64汇编语言-$/取当前行代码的地址
  3. Spring-ClassPathBeanDefinitionScanner
  4. 计算机网络具有双重性特点,计算机网络(本)_201806_模拟卷2_答案
  5. captcha must be filled out_直播行业这些英文单词,不知道你就out了
  6. 20165223《网络对抗技术》Exp3 免杀原理与实践
  7. Tomcat的部署+第一个Servlet
  8. DirectX SDK 重大版本变化记录[转]
  9. C\C++的转义字符
  10. C++---哈希闭散列与开散列