第一章 面向对象程序设计概述

面向对象的语言


:钟表。(本质特征:都是看时间)


对象(类的实例):某块特定的钟表。(颜色、形状等可能不一样)


:分类的主要依据:抽象。例如:石头、汽车、树木等都是人们长期的生产生活中抽象出来的概念。


类与对象的关系:犹如模具与铸件的关系,一个属于某类的对象称为该类的一个示例。


封装:尽可能简化内部细节。对外形成一个边界,只保留有限的对外接口使之可以与外部发生反应。例如:sort函数就是一个封装好的函数,直接输入地址就可以对数组进行排序。


继承:特殊类拥有一般类的全部属性与服务,我们称为特殊类对一般类的继承。例如:轮船是一般类,客船是特殊类。(a是一般类,如果b有a全部属性特点,在此基础上,b还有特殊的属性,那么b就是特殊类。)


源程序:还没翻译的代码。(机器无法识别)


目标程序:源程序经过翻译生成的程序,可以直接执行。


翻译程序


程序的开发过程:(C++为例)


第二章 面向对象程序设计基础


cin和cout基本输入和输出:getline(cin,str):输入带空格字符串。


常变量的定义:const 变量类型 变量名=x(所定义的变量为常量)


引用与常引用:(对一块地址重复命名)

    int n = 10;int &a = n;       //引用const int &b = n; //常引用cout << a << ' ' << b << endl;

内联函数:系统直接将调用内联函数的地方用等价的语句替换,减少运行环境的保存和恢复时间。(在函数名前面加上inline即是内联函数,但是内联函数只适合小功能的函数,例如一个计算公式等)


带缺省值的函数:预先给定形参值,如果不给定实参值,则采用形参值。



函数重载:多个 参数数量 或参数类型 不同的函数 函数名相同


动态内存分配(注意:返回的是分配的空间的首地址)

  • 单个元素的内存分配:

   int *p, *q;p = new int(3);//初始化该空间的值为3q = new int;delete[] p;delete[] q;
  • 多个元素的内存分配:

    int *p, *q;p = new int[10]; //分配10个int型的元素,把该内存的首地址给pq = new int;delete[] p;delete[] q;

动态内存的释放:delete

    int *p, *q;p = new int[10];q = new int;delete[] p; //多个元素的动态内存释放delete q;   //单个元素的动态内存释放

第三章 类和对象(一)

c++面对对象程序设计,也使用了类和对象的概念,并通过下面的方法来模拟对象的状态和行为:

  • 1.对象的状态通过对象的属性数据来描述。
  • 2.对象的行为:定义一个函数集,通过调用对应函数表示对象完成一个行为。

:由成员变量(数据成员)和成员函数组成

对象的定义:类名 对象名(形如int a、double a)。

对象的访问:

代码示例:

 class student{public:int score;string name;void change_score(int a){score = a;}void change_name(string a){name = a;}};int main(){student a;a.change_score(100);a.change_name("hesor");cout << a.name << ' ' << a.score << endl;return 0;}
/*
Output:
hesor 100
*/

构造函数:主要用来初始化对象的数据成员,构造函数可以重载。构造函数没有函数返回类型,且函数名与类名相同。

代码示例

class student
{public:int score;string name;student(){score = 10;name = "orz";}student(int s, string n){score = s;name = n;}void change_score(int a){score = a;}void change_name(string a){name = a;}
};
int main()
{//调用无参构造函数 注意:不是student a()student a;student b(100, "hesor");cout << a.name << ' ' << a.score << endl;cout << b.name << ' ' << b.score << endl;return 0;
}
/*
Output:
orz 10
hesor 100
*/

类的访问控制


析构函数:析构函数和构造函数类似,不过构造函数是在创建对象的时候自动调用,而析构函数是在销毁对象的时候程序自动调用。但是析构函数需在函数名前加上~,并且析构函数没有参数(因此析构函数不能重载)。


拷贝构造函数:一种特殊的构造函数,用一个已存在对象来初始化正在创建的新对象。


类的继承:A类继承B类,B叫做基类,A叫做派生类(也叫做父类与子类)。

class student : public person
{};

上面就是以persoon类为基类,student为派生类的公有继承方式,student类自动继承person类中的所有属性和方法(可以根据需要在派生类中添加属性和方法)。


派生类构造函数

class person
{public:string name;int high;person(string a, int h){name = a;high = h;}
};
class student : public person
{public:int score;// student(int a)  //1// 如果采用 1 这种派生类的构造函数,那么基类默认使用无参构造函数初始化从基类继承的成员student(int a) : person("hesor", 170) //派生类构造函数{score = a;}
};
main()
{student a(100);cout << a.name << ' ' << a.score << ' ' << a.high << endl;return 0;
}
/*
Output:
hesor 100 170
*/

派生类构造函数:与基类构造函数一样,但是需要注意一点:派生类析构函数调用的时候基类中的析构函数也会调用!

class person
{public:string name;int high;person(string a, int h){name = a;high = h;}~person(){cout << "基类 end... ..." << endl;}
};
class student : public person
{public:int score;// student(int a)  //1// 如果采用 1 这种派生类的构造函数,那么基类默认使用无参构造函数初始化基类成员变量student(int a) : person("hesor", 170) //派生类构造函数{score = a;}~student(){cout << "派生类 end... ..." << endl;}
};
main()
{student a(100);cout << a.name << ' ' << a.score << ' ' << a.high << endl;return 0;
}
/*
Output:
hesor 100 170
派生类 end... ...
基类 end... ...
*/

函数重定义:派生类对基类中继承过来的函数进行重新定义(要求函数返回值、参数个数、参数类型完全一致)。

class person
{public:void f(){cout << "基类" << endl;}
};
class student : public person
{public:void f(){cout << "派生类" << endl;}
};
main()
{student a;person b;a.f();b.f();return 0;
}
/*
Output:
派生类
基类
*/

多重继承下的派生类的定义

class student
{public:void f_student(){cout << "我是学生" << endl;}
};
class teacher
{public:void f_teacher(){cout << "我是老师" << endl;}
};
class student_teacher : public student, public teacher
{};
main()
{student_teacher a;a.f_student();a.f_teacher();return 0;
}
/*
Output:
我是学生
我是老师
*/

注意,在继承时,总是先调用基类的构造函数再调用派生类的构造函数,多重继承时,按照继承基类的顺序调用构造函数。析构函数的调用顺序恰好与构造函数的调用规律相反。


多重继承中的二义性问题:由于多重继承有多个基类,基类的属性名和方法名可能重复,所以派生类中会产生二义性问题。例如下图,若A有成员变量name,BC继承了A之后 都会有变量 name,然后 D又多重继承了BC,那么D就会有两个name变量,调用的时候就会产生二义性。

A
B
C
D

解决方法

  • 通过作用域运算符指定要调用哪个基类的属性和方法:

class person
{public:int NUM = 123456;
};
class student : public person
{};
class teacher : public person
{};
class student_teacher : public student, public teacher
{};
main()
{student_teacher a;cout << a.teacher::NUM;return 0;
}
/*
Output:
123456
*/
  • 虚拟继承:加入virtual关键字,将图中的A类定义为虚基类,虚基类的成员在类的继承关系中只会被继承一次。

class person
{public:int NUM = 123456;
};
class student : virtual public person
{};
class teacher : virtual public person
{};
class student_teacher : public student, public teacher
{};
main()
{student_teacher a;cout << a.NUM;return 0;
}
/*
Output:
123456
*/

更新ing… …

程序设计基础II学习笔记相关推荐

  1. 微信小程序开发:学习笔记[8]——页面跳转及传参

    微信小程序开发:学习笔记[8]--页面跳转及传参 页面跳转 一个小程序拥有多个页面,我们可以通过wx.navigateTo推入一个新的页面.在首页使用2次wx.navigateTo后,页面层级会有三层 ...

  2. 微信小程序开发:学习笔记[9]——本地数据缓存

    微信小程序开发:学习笔记[9]--本地数据缓存 快速开始 说明 本地数据缓存是小程序存储在当前设备上硬盘上的数据,本地数据缓存有非常多的用途,我们可以利用本地数据缓存来存储用户在小程序上产生的操作,在 ...

  3. 黑马程序员Maven学习笔记

    前言 这里是黑马程序员Maven学习笔记分享,这是视频链接. 我还有其它前端内容的笔记,有需要可以查看. 文章目录 前言 基础 Maven简介 Maven是什么 Maven的作用 Maven的下载 M ...

  4. 小程序开发实战学习笔记

    序言 原本题目写的时候实战经验,但是觉着算不上什么经验,就改成学习笔记了? 注册小程序账号 开发和发布流程 小范围讨论公公抽离之类 不写公共样式因为不知道别人会不会用你的 目录结构 小程序包含一个描述 ...

  5. Java程序猿JavaScript学习笔记(4——关闭/getter/setter)

    计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...

  6. java程序设计基础篇_java程序设计基础篇 复习笔记 第一单元

    java语言程序设计基础篇笔记 1. 几种有名的语言 COBOL:商业应用 FORTRAN:数学运算 BASIC:易学易用 Visual Basic,Delphi:图形用户界面 C:汇编语言的强大功能 ...

  7. 黑马程序员C++学习笔记(第三阶段核心:STL)--- 更新中

    目录 迭代器 序列式容器 vector -- 可随机访问 list -- 不支持随机访问 deque -- 动态 关联式容器 -- 红黑树 map multimap set multiset -- 废 ...

  8. 10x程序员工作法 学习笔记

    前言 这篇文章是在学习极客时间专栏<10x程序员工作法>后,做出的学习笔记. 工作中应该如何思考: 以终为始 沟通反馈 以终为始:遇到事情,倒着想 网上流传着一个帖子,亚马逊 CTO 介绍 ...

  9. Python程序设计基础第一章笔记:Python概述

    Python程序设计基础笔记 目录 Python程序设计基础笔记 第一章:python概述 1.1 python是这样一种语言 1.2 python版本之争 略 1.3 python编程规范与代码优化 ...

  10. 黑马程序员-C#学习笔记(二)

    ---------------------- ASP.Net+Android+IOS开发..Net培训.期待与您交流! ---------------------- - C# 学习笔记 一.变量与表达 ...

最新文章

  1. 计算机控制系统中的模拟输入通道需应用,远程西安交通大学17年3月课程考试《计算机控制技术》作业考核试题...
  2. mysql 原理 ~ DDL之在线DDL
  3. MySQL 5.7 并行复制实现原理与调优
  4. VC2008 忽然无法调试DLL的解决方法
  5. RxSwift之订阅UITableViewCell里的按钮点击事件
  6. 【转】C#中使用TransactionScope类(分布式事务) 和 锁
  7. Anigram单词(51Nod-1095)
  8. 请简述gouraud光照模型_OpenGL ES for Android(冯氏光照)
  9. Android线程,线程池使用及原理博文参考
  10. python编辑svg文件_如何修改pygal生成的svg文件背景色
  11. ggplot2作图详解:分面(faceting)
  12. Spring MVC URL的映射问题 ;Spring MVC 跳转与iframe包含地址问题
  13. 解决maven打包编译出现File encoding has not been set问题
  14. 用Python实现黑客帝国代码雨效果
  15. 高中分班考试如何计算机,新高一生如何应对分班考?
  16. python人脸对比相似度_Python比较两个图片相似度的方法
  17. 用 Mixly 玩 ESP8266(ESP-01模块)之二
  18. 互联网晚报 | 12月10日 星期五 | B站月均活跃UP主达270万人;宝马电动车总销量破百万;苹果市值逼近3万亿美元...
  19. html列表自动无限循环滚动,js 无限循环垂直滚动列表
  20. bzoj:1922: [Sdoi2010]大陆争霸 (luogu 2446)

热门文章

  1. 安装MyEclipse10 并且破解(附带软件包)
  2. 2022年计算机软件水平考试网络管理员(初级)练习题及答案
  3. UCHome二次开发 规范
  4. OpenID实现多系统整合的用户同步解决方案
  5. html图片边框显示不全,css border边框显示不完全
  6. (转载)奇谈怪论:从容器想到去IOE、去库存和独角兽
  7. Linux和DOS常用命令对照表
  8. 东芝2510ac请求维修cd40_TOSHIBA东芝2510复印机维修资料
  9. 浅谈权限设计(从接口权限到数据权限)
  10. 昆腾通过集成新的LTO-8磁带扩大在存储效率领域的领导地位