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++学习笔记第三天:类、虚函数、双冒号的更多相关文章

  1. C++ Primer学习笔记(三) C++中函数是一种类型!!!

    C++中函数是一种类型!C++中函数是一种类型!C++中函数是一种类型! 函数名就是变量!函数名就是变量!函数名就是变量! (---20160618最新消息,函数名不是变量名...囧) (---201 ...

  2. C++学习笔记:多态篇之虚函数

    一.类型 在引入多态之前,我们先来看一下多态的两种类型: 二.多态性的概念 多态一词最初来源于希腊语,意思是具有多种形式或形态的情形,在C++中是指同样的消息被不同类型的对象接收时导致不同的行为,这里 ...

  3. 深入理解Java虚拟机学习笔记(三)-----类文件结构/虚拟机类加载机制

    第6章 类文件结构 1. 无关性 各种不同平台的虚拟机与所有平台都统一使用的程序存储格式——字节码(即扩展名为 .class 的文件) 是构成平台无关性的基石. 字节码(即扩展名为 .class 的文 ...

  4. Scala学习笔记(三)类层级和特质

    无参方法 功能:将方法的定义转换为属性字段的定义: 作用范围:方法中没有参数,并且方法仅能通过读取所包含的对象属性去访问可变状态,而不改变可变状态,就可使用无参方法: 例子: abstract cla ...

  5. Scala学习笔记(三)—— 方法和函数

    1. 方法 方法使用 def 定义: def 方法名(参数名:参数列表,…) :返回值类型 = { 方法结构体 } scala> def add(x : Int ,y : Int):Int = ...

  6. C#可扩展编程之MEF学习笔记(三):导出类的方法和属性

    前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下MEF是如何导出方法和属性的. 还是前面的代码,第二篇中已经提供 ...

  7. PyQt4入门学习笔记(三)

    # PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...

  8. X-Cart 学习笔记(三)X-Cart框架2

    目录 X-Cart 学习笔记(一)了解和安装X-Cart X-Cart 学习笔记(二)X-Cart框架1 X-Cart 学习笔记(三)X-Cart框架2 X-Cart 学习笔记(四)常见操作 3.了解 ...

  9. .NET Remoting学习笔记(三)信道

    目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 参考:♂风车车.Net .NET Framework ...

  10. opencv学习笔记(三)基本数据类型

    opencv学习笔记(三)基本数据类型 类:DataType 将C++数据类型转换为对应的opencv数据类型 OpenCV原始数据类型的特征模版.OpenCV的原始数据类型包括unsigned ch ...

随机推荐

  1. python_将多个小字符拼接成大字符?

    案例: 下面有一个列表,如何把这个列表拼接成一个字符串? l = [1, 2, 3, 4, 'a', 'b', 'c'] 有哪些方法? 方法1: for进行迭代拼接 #!/usr/bin/python ...

  2. TinyXML 的简单介绍以及使用

    先说几句重点: 1,tinyxml 生成或解析XML非常好用 2,tinyxml 利用DOM(文档对象模型)操作XML,根节点与各个子节点相当于形成一棵树 3,只要你了解tinyxml的用法,可以只n ...

  3. JDBC (一)

    1 JDBC 简介 sun公司为了简化.统一对数据库的操作,定义了一套java操作数据库的规范,称之为JDBC. 数据库厂商的驱动就是对JDBC的实现. 没有JDBC之前  vs 有JDBC之后 JD ...

  4. Unity 使用Plugins接入安卓SDK 基础篇

    一.须知 本帖适合对安卓一点基础都没有,有一定Unity基础.刚刚接完一个某文档很简单的渠道SDk,也当是自己总结一下. 二.Unity中的目录创建与理解. Plugins:插件目录,该目录再编译项目 ...

  5. plus、max、Pro、Edge

    plus.max.Pro.Edge等后缀到底什么意思? Plus:比好更好.比牛X更牛X 译成中文是:加.和.正的-的意思.比如oneplus中文名就是一加.用于手机命名表示配置更加牛X,最早是由iP ...

  6. Java使用Openoffice将word、ppt转换为PDF

    最近项目中要实现WORD的文件预览功能,我们可以通过将WORD转换成PDF或者HTML,然后通过浏览器预览. OpenOffice OpenOffice.org 是一套跨平台的办公室软件套件,能在 W ...

  7. Java中的最值

    Double.MAX_VALUE     等于 (2-2^(-52)) * 2^1023 约等于2^1024Double.MIN_VALUE      最小正非零值 2^(-1074)Long.MAX ...

  8. Electron 打包Mac安装包代码签名问题解决方案Could not get code signature for running application

    最近一直在做electron应用的打包,集成mac版本的自动更新时出现了问题. Error: Could not get code signature for running application ...

  9. 基于线程池的线程管理(BlockingQueue生产者消费者方式)实例

    1.线程池管理类: public class ThreadPoolManager { private static ThreadPoolManager instance = new ThreadPoo ...

  10. CSS核心内容之盒子模型

    1.盒子模型具有的属性: 内容(content) 填充(padding) 边框(border) 边界(margin) 图示如下: 2.流概念 1.流的概念 在现实生活中已经流水,在网页设计中就是指元素 ...