C++新特性(类)(转载)
C++新特性(类)里面讲的很清楚,转给大家分享一下
类机制:
类是对某一类对象的抽象;对象是某一类的实例;
类是一种复杂的数据类型,将不同类型的数据和这些数据相关的操作封装在一起的集合体;
通过一道程序题来感受从结构到类的转变:
传统的面向过程程序设计中,程序的表示方法是:
程序=算法+数据结构
面向对象程序设计中,程序的表示方法是:
对象=算法+数据结构
程序=对象+对象+对象+。。。
一个操作银行账户的程序,用面向过程的方法来做,思路如下:
先创建一个银行账户的结构,然后增加存钱,取钱,打印,初始化等相关的各种函数。
| 1 | #include <iostream>    using namespace std;  struct savings{      int accountId;      float balance;  };  savings s;  void saving(float money);  void assume(float money);  void init();  void disp();  int main()  {      float money=0;      init();      cout<<"请输入存款金额:"<<endl;      cin>>money;      saving(money);      cout<<"请输入取款金额:"<<endl;      cin>>money;      assume(money);      disp();      return 0;  }  void init(){      s.accountId=10000;      s.balance=0;  }  void saving(float money){      s.balance+=money;  }  void assume(float money){      s.balance-=money;  }  void disp(){      cout<<"账号:"<<s.accountId<<endl;      cout<<"余额:"<<s.balance<<endl;  } | 
问题:如果这个时候,银行要求实现更多的功能,如外汇存款交易,外汇取款交易,自动利息计算等,则必须扩充原来数据结构,数据结构一旦改变,依赖它的函数也必须跟着改变,这样就需要不断地维护以前的函数,同时扩充新的函数
解决方法:用面向对象的方法来进行编程,先定义好一个银行账户类,然后不断地对这个类进行扩充和叠加就可以实现新功能,而不用维护原来的代码。类的定义格式一般分为声明和实现两部分,其中声明部分用来说明类中的成员(告诉使用者“干什么”),包含数据成员的声明和成员函数的声明。实现部分用来对成员函数的实现(告诉使用者“怎么干”)。
下面程序为用对象来实现银行账户的操作
在头文件saving.h中:
| 1 | #ifndef SAVING_H_INCLUDED  #define SAVING_H_INCLUDED  #include<iostream>  class CSaving  {      int accoutId;      float balance;  <span style="color:#000000;">public:  </span>    void init(){          accoutId=10000;          balance=0;      }      void saving(float money)      {          balance+=money;      }      void assume(float money)      {          balance-=money;      }      void disp(){          cout<<"账号为:"<<accoutId<<endl;          cout<<"余额为:"<<balance<<endl;      }  }      #endif // SAVING_H_INCLUDED | 
在源文件main.cpp中
| 1 | #include <iostream>  #include "Saving.h"      int main()  {      CSaving s;            //定义CSaving对象s      float money=0;      s.init();                 //初始化对象s,用对象来给其成员进行赋值和操作      cout<<"请输入存款金额:";      cin>>money;      s.saving(money);      cout<<"请输入取款金额:";      cin>>money;      s.assume(money);      s.disp();      return 0;  } | 
程序中 public关键字,使用来把类体中的成员函数的访问权限设定为公共访问权限,即定义为类对外的接口。具有公共访问权限的成员可以在程序中被对象访问和调用。
从代码中可以看出,所有的方法都是通过对象s调用的,相当于对象本身就具有存钱,取钱,打印和初始化等方法了。
通过这段代码和面向过程相比较,可以很清楚的感受到面向对象的优越性。如果是面向对象的程序设计方法,只需要把类设计好,然后用其定义对象,在程序中,就只是对象的叠加而已。
指向对象的指针:
对象指针名->数据成员名 //访问类的数据成员
对象指针名->成员函数名(参数表) //访问类的成员函数
要访问CSaving类的对象指针pSaving所指向的对象中的成员,方法为:
pSaving = &CSaving
pSaving->accountId;
pSaving->saving(1.5);
内联函数:把函数实现放在类体中的成员函数,编译时被当做内联函数;调用时,是把调用函数处的语句,用内联函数体的代码来替换,节省了调用的开销,提高了运行的速度。
外联函数:函数声明放在类体内,实现放在类体外的成员函数,被称为外联函数。
成员函数如果在类体内,不用加作用域运算符“::”但如果在类体外,则要在函数名的前面加上该函数所属类的标识,并用作用域运算符“::”进行连接。
“::”主要用于说明成员函数是属于哪个类的,即成员函数的声明在哪个类中,该运算符的使用格式如下
类名::函数名(参数表)
如:void CSaving::assume(float money){
....
}
成员函数可以实现重载,如参数个数不同的重载
可以给成员函数的参数设置默认值:
如在CTest类中声明:void init(int n=10);
在存放函数定义的源文件:void CTest::init(int n){
sum=n;
}
在main.cpp中,CTest t1,t2;
t1.init();这个时候就是用默认值,
t2.init(5);这个时候是用的是传的参数5,不是用默认值。
类对成员访问控制
优点:1、如同电视机,内核被保护,按钮被人人使用;2、使类对其本身内部函数实现的负责;3、限制类与外部世界的接口;4、减少类与其他代码的关联程度。
各种控制关键字:
public公共访问:public定义的成员,就是类对外的接口,外部只能通过这个接口,才能访问类的成员。其一般是成员函数,以方便用户调用
protected和private定义的成员,一般是类的数据成员,主要用来描述类的对象的属性,用户无法直接访问和使用,只有类中成员函数才能对其进行访问和使用。
我觉得一个c++的界面库也不错:http://www.uipower.com/index.php?m=content&c=index&a=lists&catid=9
C++新特性(类)(转载)的更多相关文章
- JDK1.5/1.6/1.7之新特性总结(转载)
		原文地址:http://www.cnblogs.com/yezhenhan/archive/2011/08/16/2141510.html 如果原作者看到不想让我转载请私信我! 开发过程中接触到了从j ... 
- Java8新特性(转载)
		1.Lambda表达式 Lambda表达式(也称为闭包)是整个Java 8发行版中最受期待的在Java语言层面上的改变.使用 Lambda 表达式可以使代码变的更加简洁紧凑. Lambda允许把函数作 ... 
- 使用Modernizr探测HTML5/CSS3新特性(转载)
		转载地址:http://www.cnblogs.com/TomXu/archive/2011/11/18/detecting-html5-css3-features-using-modernizr.h ... 
- C# 6.0新特性(转载)
		简介 VS 2015中已经包含C# 6.0. C#在发布不同版本时,C#总是会有新特性,比如C#3.0中出现LINQ,C#4.0中的动态特性,c#5.0中的异步操作等.. C# 6.0中与增加了不少新 ... 
- VS2015 C#6.0 中的那些新特性(转载)
		自动属性初始化 (Initializers for auto-properties) 以前我们是这么写的 为一个默认值加一个后台字段是不是很不爽,现在我们可以这样写 只读属性的初始化(Getter-o ... 
- 前端笔记之ES678&Webpack&Babel(中)对象|字符串|数组的扩展&函数新特性&类
		一.对象的扩展 1.1对象属性名表达式 ES6可以在JSON中使用[]包裹一个key的名字.此时这个key将用表达式作为属性名(被当做变量求值),这个key值必须是字符串. var a = 'name ... 
- Mysql 5.6 新特性(转载)
		本文转载自 http://blog.csdn.net/wulantian/article/details/29593803 感谢主人的辛苦整理 一,安全提高 1.提供保存加密认证信息的方法,使用.my ... 
- 003.ES2015和ES2016新特性--类.md
		JavaScript使用的是基于原型的OO模型,用对象字面量或者函数来实例化对象,用原型链来实现继承. 这样对于数据传统C++.Java的OO范式的开发者来说,会感到比较困惑,于是从ES2015开始逐 ... 
- ECMASCRIPT5新特性(转载)
		Function 1: Object.create 这是一个很重要的改动,现在我们终于可以得到一个原型链干净的对象了.以前要创建一个类 function Cat(name) { this.name ... 
- 2.ES6引进的新特性——类Class
		为什么? ES6中引入了类,类在java/c++等面向对象的编程语言常见,JS引入类是为了在日后使用js开发大型的应用程序,类本质是语法糖(语法上更加人性化) 以前写一个类 function User ... 
随机推荐
- h4和h5的区别
			h4和h5的区别 相关文章 微信ID:WEB_wysj(点击关注)◎◎◎◎◎◎◎◎◎一┳═┻[▄ (页底留言开放,欢迎来吐槽) ●●● 1.HTML5为什么只需要写<!DOCTYPEHTML&g ... 
- checkbox提交多组数据到action
			突然想通过checkbox来提交多组数据到action,一时间想不起来怎么写,到网上流岚大婶们的笔迹之后,有了新发现! 方法一: 在action用一个String类型的变量来接受checkbox传过来 ... 
- vb6 获取 http only 的 Cookie
			Option Explicit ' No more data is available. ' The data area passed to a system call is too small. P ... 
- Django教程
			开发环境:Centos7,Django 1.10,Python 2.7 Django入门 本教程内容大部分来源于Django官网,有翻译不到位的欢迎大家指正,这部分的内容有助于新手快速搭建一个网站,让 ... 
- ThinkPad E440 Ubuntu 13.1无线网卡 RTL8723BE 驱动解决办法总结
			方法一.在使用网线链接到情况下 第一步.执行下边到命令,即从github上下载驱动程序并安装 sudo apt-get install linux-headers-generic build-esse ... 
- ADF_Controller系列3_通过创建ADF Menu作为页面向导(Part1)
			2015-02-15 Created By BaoXinjian 
- 自制公众平台Web Api(微信)
			最近一段时间感觉没什么东西可以分享给大家,又由于手上项目比较赶,不太更新博客了,今天趁着生病闲下来的时间分享一些项目中的东西给大家. 公众平台 提起公众平台当下最流行的莫过于腾讯的微信了,当然还有易信 ... 
- Redis 新特性---pipeline(管道)
			转载自http://weipengfei.blog.51cto.com/1511707/1215042 Redis本身是一个cs模式的tcp server, client可以通过一个socket连续发 ... 
- 安卓:assets目录下的文本文件(不受R文件节制)
			try { InputStream in = getAssets().open("testAsset.txt"); byte[] buffer = new byte[1024]; ... 
- (转自http://www.blogjava.net/moxie/archive/2006/10/20/76375.html)WebWork深入浅出
			(转自http://www.blogjava.net/moxie/archive/2006/10/20/76375.html) WebWork深入浅出 本文发表于<开源大本营> 作者:钱安 ... 
