Ⅰ:类概念

一:类的构成

class  类名
{
public:
公有数据成员和成员函数;类的接口
protected:
保护数据成员和成员函数;
private:
私有数据成员和成员函数;
};//注意一定不要忘记分号

对象和对象之间的关系:分别使用不同的内存来存储数据,使用相同的内存上的函数(一份函数拷贝)

二:创建类和使用类的基本流程

1.基本概念

类的声明和设计是最基础最重要的部分,合理的类声明可以让后面的工作很方便,也是面向对象思想的体现。

首先通过上面的结构图已经知道类的基本结构,首先就是数据,数据有公有和私有之分,这是权限。根据实际中的要求来决定数据的共有和私有属性。

然后就是函数。函数和数据其实是一样的。也有共有和私有之分。根据实际情况来确定是公有和私有。

class和struct定义的类稍有区别class的成员没有访问限定符(public,private,protected)时会默认成员为私有成员,struct会默认为公有成员

成员函数

在类外定义时要在函数名字前加类的名字和作用域符(::)来表示这个函数是在其所属的类作用域内。

在类内定义的成员函数默认为inline函数(内联函数)如果要在类外定义inline函数需要显式的在函数声明或定义前加关键字inline。成员函数也可以重载典型的如构造函数。

访问控制和封装

访问限定符

public:公有成员成员在任何函数或类中都可以被访问。

private:成员只能由类自己的成员函数或友元访问

protect访问权限介于public和prrivate之间。

2.构造函数

函数中有一个特殊的函数,那就是构造函数。因为一个类中大部分数据是隐藏的,总不能老是通过调用公共函数的方法来进行初始化。C++提供的就是构造函数的方法。

构造函数的建立规则是这样的。构造函数没有返回值,构造函数的名字和类的名字完全一模一样(大小写也相同),所有看到一个类声明中没有返回值,那么说明这个函数是构造函数,构造函数必须放在public下面。构造函数可以有很多种选择,这时候就需要用到函数重载的方法来定义了。

一般的构造函数声明为:

类名(){}
类名(参数表):初始化列表{函数体}
eg X(int a):r(a),g(a){h(a)};//初始化的时候是根据成员数据定义的顺序初始化
必须使用初始化的 引用成员 const类型的成员未提供默认构造函数的类类型其他的都可以在刚定义的时候赋予初值

一般最好写两个构造函数

 默认构造函数:Student();
带有参数的构造函数:Student(参数列表);

注意:

在完全没有自已定义构造函数的时候,系统会提供一个默认构造函数,类似于Student(){}这个样子,仅仅创建一个对象但是不做任何初始化。也就是说,此时的一些数据成员都是没有被初始化的。

要是自己提供了构造函数,就必须自己同时为系统提供一个默认构造函数。

自己定义默认构造函数的方式有两种:定义一个没有参数的构造函数。给已有的构造函数的全部参数提供默认值。本质上,这两个构造函数使用的时候都不用加上任何参数。所以才能够做默认构造函数。

3.析构函数

构造函数起到了构造对象的作用,那么怎么销毁不需要用的对象呢。那就是析构函数。必须有一个析构函数若程序员没有提供析构函数,系统将自动提供一个默认的析构函数

析构函数定义方式:

1.原型:(~类名())

2.实现Student::

~Student()
{
函数体;
}

通常不在代码中显式的调用析构函数。

静态存储类对象(static):作用域为整个类,不随对象的消亡而消亡;

注意!!!!!!!不属于任何一个对象;

静态数据成员被当作类内的"全局变量";对非static数据成员每个对象都有一个自己的副本,而static数据成员则属于整个类并不在某个单独的对象中存在每个对象对它的操作都会使整体的static改变。

static数据成员对整个类类型只有一个由这个类型所有的对象共享访问。

初始化 static数据成员属于类,不属于某个特定对象因而不能再构造函数中初始化;所以需要在类定义之外初始化使用类名字限定但不需要重复用static限定(如果未初始化则编译器自动赋初值默认为0字符串默认为空)

4.类声明式样 (一个类为例)

class 类名{
数据成员;
public:
类名():初始化列表{
函数体;//可调用其他函数称为委托函数;
};//无参构造函数;
类名(参数):初始化列表{
函数体;
};//带参构造函数;
函数体;
}

1.自定义的构造函数创建对象(C++11的几种初始化方式统一起来了)

类名(参数)变量名;

2.自定义的默认构造函数创建对象

类名()变量名;

三:关于const成员函数

有时候,我们创建了一个对象,但是事实上,我们只希望这个对象初始化之后不被改变,它可以是一个真理或者是什么,就是不能被改变。 onst成员

const数据成员用来描述对象中的常量,只能在构造函数初始化列表中初始化并且一旦初始化就不能更改。

const函数 将一个成员函数声明为const表明这个成员函数不会修改对象的数据成员,能保证对象的常量性

声明形式:

返回类型	成员函数名(参数表) const;

定义形式:

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

const成员函数中不能修改类的数据成员,也不能调用其它非const成员函数(因为非const成员函数有可能会改变数据成员这样就会间接的改变数据成员导致编译出错)(ps const成员函数可以改变static成员的值)

只有声明为const的成员函数才可以被const对象调用,const对象不能调用非const成员函数,但是非const对象可以调用const成员函数(这个地方比较绕应该多看几遍加深理解!!!)

(psC++规定常对象只能调用它的常成员函数、静态成员函数、构造函数(具有公有访问权限)

如果一个成员函数是const的,则const对象可以调用它,非const对象也可以调用它,不会改变对象中的成员。

一定要强制养成在不改变类中的值得函数后加const的习惯!!使之成为const成员函数

四、this指针

每个成员函数都有一个隐含的参数,指向接收消息的对象称为this指针。

X类的this指针的类型是X*

this指针式一个常量含有当前对象的地址不能取它的值也不能改,常用于区分与局部变量重名的数据成员,返回当前对象,获取当前对象的地址。

访问器和修改器

因为对象的封装性private的成员函数无法直接访问于是就需要一种public函数来对他们进行访问和修改这就是访问器和修改器。

五、友元

让非成员函数访问一个类中的私有数据,需要在类中将这个函数声明为友元用friend关键字

友元必须在被访问的类中声明。一个类的友元可以是全局函数另一个类的成员函数或另一个类。

六:对象数组

当创建多个对象的时候,一个名字一个名字来写的话会很累。比如一个班上所有的人数。所以,这个时候用数组是一个很方便的选择。

创建格式:

1.创建且调用默认构造函数。

Student stu[100];

1

没错,就是这么简单(当然在底层,这些都是直接调用的默认的构造函数。)

2.创建调用自己写的构造函数初始化。

Student stu[100] =

{

Student(参数列表。。), //自定义构造函数初始化

Student(),//默认构造函数初始化





}

以两个程序来具体演示简单类的使用:

学生成绩管理系统:

#include <iostream>
#include <vector>
#include <map>
#include <string>
#include<algorithm>
using namespace std;
class student{
struct CJ{
string nam;
double grade;
double jd;
}ob;
vector<CJ> st;
double JD;
string name;
string xuehao;
string zy;
int nj,bj,pm;
public:
student():name("none"),zy("none"),xuehao("none"),nj(-1),bj(-1),pm(-1) {st.clear();}
void shuru(){
cout<<"请输入学生姓名:";
cin>>name;
cout<<"请输入学生学号:";
cin>>xuehao;
cout<<"请输入专业:";
cin>>zy;
cout<<"请输入班级(如2018-3)";
scanf("%d-%d",&nj,&bj);
cout<<"输入成绩(名称 成绩 学分)end 结束输入"<<endl;
while(true){
cin>>ob.nam;
if(ob.nam=="end"||ob.nam=="End"||ob.nam=="END") break;
cin>>ob.grade>>ob.jd;
st.push_back(ob);
}
}
/* bool cmp (student a,student b){
return a.JD>b.JD;
}*/
bool operator <(const student& d){
return JD<d.JD;
}
void jisuan(){
double sum=0,sum1=0,sum2=0;
for(auto i=st.begin();i!=st.end();i++){
sum=sum+i->jd;
if(i->grade>=60)
sum1=sum1+(i->grade/10-5)*i->jd;
}
JD=sum1/sum;
}
void print (){
cout<<"绩点"<<JD<<' '<<"姓名:"<<name<<' '<<"学号"<<xuehao<<' '<<"专业班级:"<<zy<<nj<<'-'<<bj<<' ';
for(auto i=st.begin();i!=st.end();i++){
cout<<i->nam<<' '<<i->grade<<' ';
}
cout<<endl;
}
/*
string getname(){
return name;
}
string gatxuehao(){
return xuehao;
}
string getzy(){
return zy;
}
int getpm(){
return pm;
}*/
};
student ob[40];
int n;
int main()
{
cout<<"请输入班级人数:";
cin>>n;
for(int i=0;i<n;i++){
ob[i].shuru();
ob[i].jisuan();
}
sort(ob,ob+n);
for(int i=0;i<n;i++) ob[i].print();
}

ATM:

#include <bits/stdc++.h>
using namespace std;
class Bankcard{
string account;
string owner;
int key;
double balance;
public:
Bankcard() :account("00000000000"),owner("Administrator"),key(123456),balance(0.1){};
Bankcard(string a,string o,int k,double b):account(a),owner(o),key(k),balance(b){};
void withdraw(int mo,int k){
if(Verification(k)) {
if(mo%100!=0) cout<<"Go to bank Counter"<<endl;
else balance=balance-mo;
}
else cout<<"Wrong password"<<endl;
}
void withdraw(double mo,int k){
if(Verification(k)) {
balance=balance-mo;
}
else cout<<"Wrong password";
}
void save(int mo,int k){
if(Verification(k)) {
if(mo%100!=0) cout<<"Go to bank Counter"<<endl;
else balance=balance+mo;
}
else cout<<"Wrong password"<<endl;
}
/* void opac(string a,string o,int k,double b){
account=a;
owner=o;
key=k;
balance=b;
}*/
void destroyac(){
withdraw(balance,key);
account="";
owner="";
key=0;
balance=0.0;
}
bool Verification(int k){
return k==key;
}
string const getow(){
return owner;
}
string const getac(){
return account;
}
double const getba(){
return balance;
}
void modify(int k){
int newkey;
if(Verification(k)) {
cin>>newkey;
key=newkey;
}
else cout<<"Wrong password";
}
~Bankcard(){
destroyac();
}
};
int main()
{
int withmo,putmo;
string ac,ow;
int key;
double bal;
cin>>ac>>ow>>key>>bal;
Bankcard ob(ac,ow,key,bal);
/*cout<<ob.getow()<<endl;
cout<<ob.getba()<<endl;
cout<<ob.getac()<<endl;*/
cin>>withmo>>key;
ob.withdraw (withmo,key);
// cout<<ob.getba()<<endl;
cin>>putmo>>key;
ob.save(putmo,key);
cout<<ob.getow()<<endl;
cout<<ob.getba()<<endl;
cout<<ob.getac()<<endl;
cin>>key;
ob.modify(key);
ob.destroyac();
return 0;
}

C++类学习(2)的更多相关文章

  1. 【转】Date类学习总结(Calendar Date 字符串 相互转换 格式化)

    原文网址:http://www.blogjava.net/jerry-zhaoj/archive/2008/10/08/233228.html Date类学习总结 1.计算某一月份的最大天数 Cale ...

  2. System类学习笔记

    最近在学习源码的过程中发现:很多深层次的代码都用到了一个类System类,所以决定对System类一探究竟 本文先对System类进行了剖析,然后对System类做了总结 一.首先对该类的中的所有字段 ...

  3. Date类学习总结(Calendar Date 字符串 相互转换 格式化)

    Date类学习总结 1.计算某一月份的最大天数 Calendar time=Calendar.getInstance();time.clear();time.set(Calendar.YEAR,yea ...

  4. Scala中的类学习

    Scala中的类学习 从java了解类的情况下,了解Scala的类并不难.Scala类中的字段自动带getter和setter方法,用@BeanProperty注解生成javaBean对象的getXX ...

  5. zt C++ list 类学习笔记

    C++ list 类学习笔记 分类: C++ 2011-09-29 00:12 7819人阅读 评论(0) 收藏 举报 listc++iteratorvectorcconstructor 双向循环链表 ...

  6. Properties工具类学习

    Properties类学习 1.定义 Properties,java.utils包下的一个工具类,主要用于读取Java的配置文件.各种语言都有自己所支持的配置文件,配置文件中很多变量是经常变动的. 这 ...

  7. RandomAccessFile类学习

    RandomAccessFile类学习 RandomAccessFile是io包的类,从Object直接继承而来,只可以对文件进行操作,可以对文件进行读取和写入. 当模式为r:当文件不存在时会报异常: ...

  8. Task类学习教程—组合任务ContinueWith

    Task类学习教程-组合任务.ContinueWith 一.简介 通过任务,可以指定在任务完成之后,应开始运行之后另一个特定任务.ContinueWith是Task根据其自身状况,决定后续应该作何操作 ...

  9. QPainter类学习

    详细描述: QPainter类提供了许多高度优化的函数去做大部分的GUI绘制工作.它可以画从简单的线到复杂的形状.通常情况下,QPainter的使用是在widget当中的painter事件使用.记得在 ...

  10. java.util.Properties类 学习笔记

    学习目标:   1.认识properties文件,理解其含义,会正确创建properties文件. 2.会使用java.util.Properties类来操作properties文件. 3.掌握相对路 ...

随机推荐

  1. 谁给你说的 Ubuntu 不可以输入中文

    文章更新于:2020-04-04 按照惯例,需要的文件附上链接放在文首 文件名:sogoupinyin_2.3.1.0112_amd64.deb 文件大小:25.5 MB 下载链接:https://w ...

  2. 家庭版记账本app进度之编辑框组件

    <EditText>中设置提示信息是用到的语句是android:hint来进行提示语句的书写. android:inputType可以将此编辑框设置为输入密码的编辑框(现实的是小黑点) a ...

  3. Java第十二天,权限修饰符

    Java当中权限修饰符共有四种.分别是public.protected.(default).private. 注:YSE代表可访问,NO代表不可访问.   同一个类 同一个包,非继承 不同的包,有继承 ...

  4. 抓包工具fiddler安装和配置

    常见的抓包工具:fiddler.wireshark,本文以安装fiddler为例: 在官网上https://www.telerik.com/fiddler下载,安装后打开fiddler. 选择好自己的 ...

  5. L3 多层感知机

    **本小节用到的数据下载 1.涉及语句 import d2lzh1981 as d2l 数据1 : d2lzh1981 链接:https://pan.baidu.com/s/1LyaZ84Q4M75G ...

  6. stand up meeting 12-10

    今天项目会议正好利用了大家上课前的十五分钟,大家对项目进度和项目中所遇到的问题进行了沟通. 由于天赋同学与重阳小组沟通及时有效,在mapping的过程中直接将单词本中的type与我们单词挑战中的que ...

  7. D-Power Products

    题目连接: 题解: 根据题目的意思,对每个X进行质因子分解,保存其质因子以及质因子出现的个数,如果两个数的乘积变成一个数的K次幂,那么两个数的质因子的指数之间相加应为k的倍数.保存完毕后,开始遍历,将 ...

  8. vue项目中使用bpmn-节点篇

    前情提要 根据之前的操作,我们可以创建.导入.导出流程图,并对其进预览.通过此篇可以学到: 为节点添加点击.鼠标悬浮等事件 获取流程图内所有指定类型的节点 通过外部更新节点名字 获取节点实例的两种方法 ...

  9. C# 静态变量、静态函数、实体变量、实体函数在一个类中的执行顺序

    为了弄清这个代码,写了个测试,但是测试的结果和往上的代码有所差别,仁者见仁,智者见智了.如果我的测试用例用问题,欢迎指出. 首先,方法的是在被调用时执行,但是静态方法在所有地方都可以调用,应该在很早的 ...

  10. ansible playbook loop 翻译

    ansible源文档地址 有时候你想多次重复一个任务. 在计算机编程中,这叫做循环. 常见的 Ansible 循环包括使用文件模块更改几个文件和 / 或目录的所有权,使用用户模块创建多个用户,并重复一 ...