程序设计基础II学习笔记
第一章 面向对象程序设计概述
面向对象的语言
:
是高级语言。
将客观事物看做具有属性和行为的对象。
通过抽象找出同一类对象的共同属性和行为,形成类。
通过类的继承和多态实现代码的重用
使得代码具有独立性、模块性。利于维护和修改。
类
:钟表。(本质特征:都是看时间)
对象(类的实例)
:某块特定的钟表。(颜色、形状等可能不一样)
类
:分类的主要依据:抽象。例如:石头、汽车、树木等都是人们长期的生产生活中抽象出来的概念。
类与对象的关系
:犹如模具与铸件的关系,一个属于某类的对象称为该类的一个示例。
封装
:尽可能简化内部细节。对外形成一个边界,只保留有限的对外接口使之可以与外部发生反应。例如:sort函数就是一个封装好的函数,直接输入地址就可以对数组进行排序。
继承
:特殊类拥有一般类的全部属性与服务,我们称为特殊类对一般类的继承。例如:轮船是一般类,客船是特殊类。(a是一般类,如果b有a全部属性特点,在此基础上,b还有特殊的属性,那么b就是特殊类。)
源程序
:还没翻译的代码。(机器无法识别)
目标程序
:源程序经过翻译生成的程序,可以直接执行。
翻译程序
:
汇编程序
:将汇编语言写的源程序翻译成目标程序。(高级语言用不到)编译程序
:将高级语言写的源程序翻译成目标程序。(C、C++)解释程序
:与编译程序的不同点:编译程序一次性将汇编程序翻译完,解释程序翻译一句、执行一句,反复进行。(JAVA、BASIC)
程序的开发过程
:(C++为例)
1.编辑
:将源程序输入到计算机中,生成后缀为cpp的磁盘文件。2.编译
:将程序的源代码转换为机器语言代码。3.连接
:将多个源程序文件以及库中的某些文件连接在一起,生成一个后缀为exe的可执行文件。4.运行调试
。
第二章 面向对象程序设计基础
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
*/
类的访问控制
:
public
:公有成员,在程序的任何地方都可以访问。一般作为类与外界的接口。private
:私有成员,只能被该类的成员函数或该类的友元访问。protect
:保护成员,与私有成员差不多,主要在继承方面有区别,(派生类可以访问基类的保护成员,但是不能访问基类的私有成员)。
析构函数
:析构函数和构造函数类似,不过构造函数是在创建对象的时候自动调用,而析构函数是在销毁对象的时候程序自动调用。但是析构函数需在函数名前加上~,并且析构函数没有参数(因此析构函数不能重载)。
拷贝构造函数
:一种特殊的构造函数,用一个已存在对象来初始化正在创建的新对象。
类的继承
: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变量,调用的时候就会产生二义性。
解决方法
:
通过作用域运算符指定要调用哪个基类的属性和方法:
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学习笔记相关推荐
- 微信小程序开发:学习笔记[8]——页面跳转及传参
微信小程序开发:学习笔记[8]--页面跳转及传参 页面跳转 一个小程序拥有多个页面,我们可以通过wx.navigateTo推入一个新的页面.在首页使用2次wx.navigateTo后,页面层级会有三层 ...
- 微信小程序开发:学习笔记[9]——本地数据缓存
微信小程序开发:学习笔记[9]--本地数据缓存 快速开始 说明 本地数据缓存是小程序存储在当前设备上硬盘上的数据,本地数据缓存有非常多的用途,我们可以利用本地数据缓存来存储用户在小程序上产生的操作,在 ...
- 黑马程序员Maven学习笔记
前言 这里是黑马程序员Maven学习笔记分享,这是视频链接. 我还有其它前端内容的笔记,有需要可以查看. 文章目录 前言 基础 Maven简介 Maven是什么 Maven的作用 Maven的下载 M ...
- 小程序开发实战学习笔记
序言 原本题目写的时候实战经验,但是觉着算不上什么经验,就改成学习笔记了? 注册小程序账号 开发和发布流程 小范围讨论公公抽离之类 不写公共样式因为不知道别人会不会用你的 目录结构 小程序包含一个描述 ...
- Java程序猿JavaScript学习笔记(4——关闭/getter/setter)
计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...
- java程序设计基础篇_java程序设计基础篇 复习笔记 第一单元
java语言程序设计基础篇笔记 1. 几种有名的语言 COBOL:商业应用 FORTRAN:数学运算 BASIC:易学易用 Visual Basic,Delphi:图形用户界面 C:汇编语言的强大功能 ...
- 黑马程序员C++学习笔记(第三阶段核心:STL)--- 更新中
目录 迭代器 序列式容器 vector -- 可随机访问 list -- 不支持随机访问 deque -- 动态 关联式容器 -- 红黑树 map multimap set multiset -- 废 ...
- 10x程序员工作法 学习笔记
前言 这篇文章是在学习极客时间专栏<10x程序员工作法>后,做出的学习笔记. 工作中应该如何思考: 以终为始 沟通反馈 以终为始:遇到事情,倒着想 网上流传着一个帖子,亚马逊 CTO 介绍 ...
- Python程序设计基础第一章笔记:Python概述
Python程序设计基础笔记 目录 Python程序设计基础笔记 第一章:python概述 1.1 python是这样一种语言 1.2 python版本之争 略 1.3 python编程规范与代码优化 ...
- 黑马程序员-C#学习笔记(二)
---------------------- ASP.Net+Android+IOS开发..Net培训.期待与您交流! ---------------------- - C# 学习笔记 一.变量与表达 ...
最新文章
- 计算机控制系统中的模拟输入通道需应用,远程西安交通大学17年3月课程考试《计算机控制技术》作业考核试题...
- mysql 原理 ~ DDL之在线DDL
- MySQL 5.7 并行复制实现原理与调优
- VC2008 忽然无法调试DLL的解决方法
- RxSwift之订阅UITableViewCell里的按钮点击事件
- 【转】C#中使用TransactionScope类(分布式事务) 和 锁
- Anigram单词(51Nod-1095)
- 请简述gouraud光照模型_OpenGL ES for Android(冯氏光照)
- Android线程,线程池使用及原理博文参考
- python编辑svg文件_如何修改pygal生成的svg文件背景色
- ggplot2作图详解:分面(faceting)
- Spring MVC URL的映射问题 ;Spring MVC 跳转与iframe包含地址问题
- 解决maven打包编译出现File encoding has not been set问题
- 用Python实现黑客帝国代码雨效果
- 高中分班考试如何计算机,新高一生如何应对分班考?
- python人脸对比相似度_Python比较两个图片相似度的方法
- 用 Mixly 玩 ESP8266(ESP-01模块)之二
- 互联网晚报 | 12月10日 星期五 | B站月均活跃UP主达270万人;宝马电动车总销量破百万;苹果市值逼近3万亿美元...
- html列表自动无限循环滚动,js 无限循环垂直滚动列表
- bzoj:1922: [Sdoi2010]大陆争霸 (luogu 2446)