C++学习笔记第三天:类、虚函数、双冒号
类
- class Box
- {
- public:
- double length; // 盒子的长度
- double breadth; // 盒子的宽度
- double height; // 盒子的高度
- };
类成员的作用域:
public:公共成员。访问权限:外部、子类、本身
protected:受保护成员。访问权限:子类、本身
private:私有成员。访问权限:本身
构造函数
跟其他语言一样,使用类名作为函数名,无返回值,可以有参数。
- #include <iostream>
- using namespace std;
- class Line
- {
- public:
- void setLength( double len );
- double getLength( void );
- Line(); // 这是构造函数
- private:
- double length;
- };
- // 成员函数定义,包括构造函数
- Line::Line(void)
- {
- cout << "Object is being created" << endl;
- }
- void Line::setLength( double len )
- {
- length = len;
- }
- double Line::getLength( void )
- {
- return length;
- }
- // 程序的主函数
- int main( )
- {
- Line line;
- // 设置长度
- line.setLength(6.0);
- cout << "Length of line : " << line.getLength() <<endl;
- return ;
- }
如果是带参数的构造函数,可以使用初始化列表:
- Line::Line( double len): length(len)
- {
- cout << "Object is being created, length = " << len << endl;
- }
上面的语法等同于如下语法:
- Line::Line( double len)
- {
- cout << "Object is being created, length = " << len << endl;
- length = len;
- }
如果有多个参数,中间用逗号隔开:
- Line::Line( double len): length(len), para02(var02)
- {
- cout << "Object is being created, length = " << len << endl;
- }
另外,初始化列表并不是构造函数专用的,类的普通成员函数也可以使用。
析构函数
这个挺新鲜的,作用跟构造函数正好相反,在对象被销毁的时候执行。
无返回值,无参数,所以无法重载,一个类只能有一个析构函数
函数名也是与类同名,只需要在前面加一个波浪线前桌:~
在析构函数中,主要用来销毁在构造函数或成员方法里 new 出来的对象或指针,最常用的就是:delete obj
- #include <stdio.h>
- #include <iostream>
- #include <vector>
- using namespace std;
- struct CP
- {
- int a;
- int b;
- };
- class TEST
- {
- public:
- CP* compound;
- int num;
- TEST(){
- compound = new CP();
- cout << "create a new TEST obj" << endl;
- };
- ~TEST(){
- cout << "delete TEST obj" << endl;
- delete compound;
- };
- };
类的继承
跟JAVA不同,C++中允许一个类继承多个父类:
- #include <iostream>
- using namespace std;
- // 基类 Shape
- class Shape
- {
- public:
- void setWidth(int w)
- {
- width = w;
- }
- void setHeight(int h)
- {
- height = h;
- }
- protected:
- int width;
- int height;
- };
- // 基类 PaintCost
- class PaintCost
- {
- public:
- int getCost(int area)
- {
- return area * ;
- }
- };
- // 派生类
- class Rectangle: public Shape, public PaintCost
- {
- public:
- int getArea()
- {
- return (width * height);
- }
- };
- int main(void)
- {
- Rectangle Rect;
- int area;
- Rect.setWidth();
- Rect.setHeight();
- area = Rect.getArea();
- // 输出对象的面积
- cout << "Total area: " << Rect.getArea() << endl;
- // 输出总花费
- cout << "Total paint cost: $" << Rect.getCost(area) << endl;
- return ;
- }
输出:
Total area: 35
Total paint cost: $2450
虚函数
这个不太好理解,只能按照别人的描述硬性记忆:在类的成员函数前面加 virtual 表示该成员函数为虚函数。
虚函数在C++中的作用不低,很多官方的源码中都存在大量的虚函数
目前位置能理解的作用包括:
1、允许用基类的指针来调用子类的这个函数:
- class A
{
public:
virtual void foo()
{
cout<<"A::foo() is called"<<endl;
}
};
class B : public A
{
public:
void foo()
{
cout<<"B::foo() is called"<<endl;
}
};
int main(void)
{
A *a = new B();
a->foo(); // 在这里,a虽然是指向A的指针,但是被调用的函数(foo)却是B的!
return 0;
}
2、通过“纯虚函数”实现抽象类
虚函数:
- virtual ReturnType funtion1(params...);
虚函数在基类中可以有默认实现,派生类也可以覆盖;
但如果在基类中没有默认实现,那么派生类必须具体实现。
纯虚函数:
- virtual ReturnType funtion1(params...)=;
在虚函数声明的后面加“=0”就表示这是一个纯虚函数,含有纯虚函数的类成为抽象类。
纯虚函数用来规范派生类的行为,即接口。派生类中必须对这个纯虚函数进行具体实现。
抽象类不能定义实例,但可以声明指向实现该抽象类的具体类的指针或引用。
对虚函数的理解,有一个很好的比方:
比如你有个游戏,里面有个含有纯虚函数 [攻击] 的抽象类 [怪物],然后有三个派生子类 [狼]、[蜘蛛]、[蛇] 都继承了 [怪物],并且都各自实现了自己独特的 [攻击] 函数。
那在出现怪物的时候就可以定义一个 虚基类指针数组,把各种怪物的指针给它,然后迭代循环的时候直接:怪物[i]->攻击() 攻击玩家就行了
- Monster *pMonster[];
- pMonster[] = new Wolf(); //初始化一匹狼
- pMonster[] = new Spider(); //初始化一只蜘蛛
- pMonster[] = new Snake(); //初始化一条蛇
- for(int i=; i<; i++){
- pMonster[i] -> attack(); //攻击
- }
双冒号(::)
1、调用 namespace 中的成员时,需要用 ::
2、在类的外部定义成员函数时,需要用::
3、区别两个类中同名的成员变量或者函数时,需要用::
4、在成员函数内部调用同名的全局变量时,需要用::
5、调用类的静态成员函数时,可以用::
C++学习笔记第三天:类、虚函数、双冒号的更多相关文章
- C++ Primer学习笔记(三) C++中函数是一种类型!!!
C++中函数是一种类型!C++中函数是一种类型!C++中函数是一种类型! 函数名就是变量!函数名就是变量!函数名就是变量! (---20160618最新消息,函数名不是变量名...囧) (---201 ...
- C++学习笔记:多态篇之虚函数
一.类型 在引入多态之前,我们先来看一下多态的两种类型: 二.多态性的概念 多态一词最初来源于希腊语,意思是具有多种形式或形态的情形,在C++中是指同样的消息被不同类型的对象接收时导致不同的行为,这里 ...
- 深入理解Java虚拟机学习笔记(三)-----类文件结构/虚拟机类加载机制
第6章 类文件结构 1. 无关性 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码(即扩展名为 .class 的文件) 是构成平台无关性的基石. 字节码(即扩展名为 .class 的文 ...
- Scala学习笔记(三)类层级和特质
无参方法 功能:将方法的定义转换为属性字段的定义: 作用范围:方法中没有参数,并且方法仅能通过读取所包含的对象属性去访问可变状态,而不改变可变状态,就可使用无参方法: 例子: abstract cla ...
- Scala学习笔记(三)—— 方法和函数
1. 方法 方法使用 def 定义: def 方法名(参数名:参数列表,…) :返回值类型 = { 方法结构体 } scala> def add(x : Int ,y : Int):Int = ...
- C#可扩展编程之MEF学习笔记(三):导出类的方法和属性
前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下MEF是如何导出方法和属性的. 还是前面的代码,第二篇中已经提供 ...
- PyQt4入门学习笔记(三)
# PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...
- X-Cart 学习笔记(三)X-Cart框架2
目录 X-Cart 学习笔记(一)了解和安装X-Cart X-Cart 学习笔记(二)X-Cart框架1 X-Cart 学习笔记(三)X-Cart框架2 X-Cart 学习笔记(四)常见操作 3.了解 ...
- .NET Remoting学习笔记(三)信道
目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 参考:♂风车车.Net .NET Framework ...
- opencv学习笔记(三)基本数据类型
opencv学习笔记(三)基本数据类型 类:DataType 将C++数据类型转换为对应的opencv数据类型 OpenCV原始数据类型的特征模版.OpenCV的原始数据类型包括unsigned ch ...
随机推荐
- python3 第十一章 - 数据类型之str(字符串)
字符串是 Python 中最常用的数据类型,我们可以使用引号 ' 或 " 来创建字符串,例如: name = 'roy' sex = "男" 1.访问字符串中的值 Pyt ...
- linux_网站计量单位
IP 独立IP数,是不同IP地址的计算机访问网站时被计算的总次数,独立IP数是衡量网站流量的一个重要指标,一般一天内相同IP地址的客户端访问网页只被计算为一次,记录独立IP的时间为一天或一个月,目前通 ...
- 学Java分布式和高架构,必懂的两大知识点!
今天小编为你们分享阿里巴巴2018年招聘应届毕业生,Java工程师的面试考题,主要分为三种 Java中获取 mysql连接的方式: 第一部分:分布式 三步变成:分布式 1.将你的整个软件视为一个系 ...
- JDBC (五)
1 使用dbutils进行一对多.多对多的开发 1.1 准备 mysql驱动的pom.xml <!-- https://mvnrepository.com/artifact/mysql/mysq ...
- JDBC(四)
1 Apache DBUtils框架 1.1 DBUtils简介 commons-dbutils是Apache组织提供的一个开源JDBC工具类库,它是对JDBC的简单封装,学习成本非常低,并且使用db ...
- js—双等号引起的类型转换过程
一.首先看双等号前后有没有NaN,如果存在NaN一律返回false 二.再看双等号前后有没有布尔,有布尔就将布尔转换为数字.(false是0,true是1) 三.接着看双等号前后有没有字符串,有三种情 ...
- window对象的属性
还不是很了解,以后补充frames opener parent
- CSS :befor :after 伪元素的妙用
本篇重点介绍CSS中的:befor.:after创建的伪元素几种使用场景,如填充文本.作为iconfont.进度线.时间线以及几何图形. 1. 介绍 1.1 说明 CSS中的:befor.:after ...
- BZOJ 4455: [Zjoi2016]小星星 [容斥原理 树形DP]
4455: [Zjoi2016]小星星 题意:一个图删掉一些边形成一棵树,告诉你图和树的样子,求让图上的点和树上的点对应起来有多少方案 看了很多题解又想了一段时间,感觉题解都没有很深入,现在大致有了自 ...
- 51Nod 1225 余数之和 [整除分块]
1225 余数之和 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 F(n) = (n % 1) + (n % 2) + (n % 3) + ... ...