第16课 类的真正形态

1. 类的关键字

(1)struct在C语言中己经有了自己的含义,必须继续兼容

(2)在C++中提供了新的关键字class用于类定义

(3)class和struct的用法完全相同。但C++中用struct定义的类中所有成员默认访问级别为public,而class定义的类成员的默认访问级别为private

【编程实验】class的初探

#include <stdio.h>

struct A
{
    //默认访问级别为public
    int i;
    int getI(){return i;};

};

class B
{
    //默认访问级别为private
    int i;
    int getI(){return i;};
};
int main()
{
    A  a;
    B  b;

    a.i = 4;//ok
    printf("a.getI() = %d\n", a.getI());

    //b.i = 4; //Error: private
    //printf("b.getI() = %d\n", b.getI()); //Error: private

    return 0;
}

2. 小实例:开发一个用于四则运算的类

(1)提供setOperator函数设置运算类型

(2)提供setParameter函数设置运算参数

(3)提供result函数进行运算:参数为引用类型用于得到计算结果。返回值表示运算的合法性。

【实例分析】Operator类的分析(Operator.h和Operator.cpp)

//Operator.h

#ifndef _OPERATOR_H_
#define _OPERATOR_H_

class Operator
{
private:
    char mOp; //操作符
    double mP1; //操作数1
    double mP2; //操作数2

public:
    bool setOperator(char op);
    void setParameter(double p1, double p2);
    bool result(double& r);
};

#endif

//Operator.cpp

#include "Operator.h"

bool Operator::setOperator(char op)
{
    bool bRet = (op == ‘+‘) || (op == ‘-‘) || (op == ‘*‘) || (op == ‘/‘);

    if(bRet)
    {
        mOp = op;
    }
    else
    {
        mOp = ‘\0‘;
    }

    return bRet;
}

void Operator::setParameter(double p1, double p2)
{
    mP1 = p1;
    mP2 = p2;
}

bool Operator::result(double& r)
{
    bool bRet = true;

    switch(mOp)
    {
        case ‘/‘:
            if((-0.000000001<mP2) && (mP2 <0.000000001))
            {
                 bRet = false;
            }
            else
            {
                  r = mP1 / mP2;
            }
            break;

         case ‘+‘:
            r = mP1 + mP2;
            break;

         case ‘-‘:
            r = mP1 - mP2;
            break;

         case ‘*‘:
            r = mP1 * mP2;
            break;
    }

    return bRet;
}

//main.cpp

#include <stdio.h>
#include "Operator.h"

int main()
{
    Operator op;
    double r = 0;

    op.setOperator(‘/‘);
    op.setParameter(9, 3);

    if(op.result(r))
    {
        printf("r = %lf\n", r);
    }
    else
    {
        printf("Calculate error!\n");
    }

    return 0;
}

3. 类声明和实现的分离

(1).h头文件只用类的声明:成员变量和成员函数

(2).cpp源文件中完成类的其它实现(如成员函数的实现)

4. 小结

(1)C++引进了新的关键字class用于定义类

(2)struct和class的区别在于默认的访问级别不同(前者public,后者private)

(3)C++中的类支持声明和实现的分离(在头文件中声明类,在源文件中实现类)

时间: 2024-10-07 20:35:46

第16课 类的真正形态的相关文章

《疯狂java-突破程序员基本功的16课 》笔记总结

本人最近读完<疯狂java-突破程序员基本功的16课 >读完后,感觉对java基础又有了新的认识,在这里总结一下:一.数组与内存控制 1.1 数组初始化 java语言的数组是静态的,即数组初始化之后,长度不可以变(区别,JavaScript数组可变,是动态的). 初始化分两种:静态初始化,初始化时由程序员指定每个数组元素的初始值,系统决定长度. 动态初始化,初始化时由程序员指定数组的长度,由系统指定默认值(int为0.boolean为false). 初始化=长度+初始值:注意不能同时指定长度又

C++--第16课 - 继承中的构造与析构

第16课 - 继承中的构造与析构 1. 赋值兼容性原则 (1)      子类对象可以当作父类对象使用. (2)      子类对象可以直接赋值给父类对象. (3)      子类对象可以直接初始化父类对象. (4)      父类指针可以直接指向子类对象. (5)      父类引用可以直接引用子类对象. 子类就是特殊的父类 #include <cstdlib> #include <iostream> using namespace std; class Parent { pro

第16课-数据库开发及ado.net-数据库SQl,创建数据库和表,增删改语句,约束,top和Distinct,聚合函数介绍

第16课-数据库开发及ado.net 数据库SQl,创建数据库和表,增删改语句,约束,top和Distinct,聚合函数介绍 SQL语句入门(脚本.命令) SQL全名是结构化查询语言(Structured Query Language) SOL语句是和DBMS“交谈”专用的语言,不同的DBMS都认SQL语法. Sql中字符串使用单引号:通过写俩个单引号来转义一个单引号. Sql中的注释“——” 单行注释比较好 判断俩个数据是否相等使用=(单等号) 在sql语句中sql代码不区分大小写 SQL主要

Spark IMF传奇行动第16课RDD实战总结

今晚听了王家林老师的Spark IMF传奇行动第16课RDD实战,课堂笔记如下: RDD操作类型:Transformation.Action.Contoller reduce要符合交换律和结合律 val textLines = lineCount.reduceByKey(_+_,1) textLines.collect.foreach(pair=> println(pair._1 + "="+pair._2)) def collect(): Array[T] = withScop

KALI LINUX WEB 渗透测试视频教程—第16课 BEEF基本使用

Kali Linux Web 渗透测试视频教程—第16课  BeEF基本使用 文/玄魂 目录 Kali Linux Web 渗透测试视频教程—第16课  BeEF基本使用....................... 1 BeEF............................................................................................................... 2 安装...................

16 元类

面向对象学习目录 1 面向对象介绍 2 类.实例.属性.方法详解 3 面向过程与面向对象进一步比较 4 类与对象 5 属性查找与绑定方法 6 小结 7 继承与派生 8 组合 9 抽象类 10 多态 11 封装 12 绑定方法与非绑定方法 13 内置方法(上) 14 内置方法(中)之描述符 15 内置方法(下) 16 元类 一 知识储备 exec:三个参数 参数一:字符串形式的命令 参数二:全局作用域(字典形式),如果不指定,默认为globals() 参数三:局部作用域(字典形式),如果不指定,默

第16课

// 第16课 // 原型 // 定义:原型是function对象的一个属性,他定义了构造函数制造出的对象的公共祖先.通过该构造函数产生 // 的对象,可以继承该原型的属性和方法.原型也是对象 // 利用原型的特点和概念,可以提取共有属性. // 3.对象如何查看原型-->隐式属性 __proto__ // 4.对象如何查看对象的构造函数 --->constuctor // Person.prototype = {} //是原型 所有Person构建的对象都继承此属性 // function

数据-第16课-栈的应用实战二

第16课-栈的应用实战二 1. 问题的提出 计算机的本质工作就是数学运算,那计算机可以读入字符串”9 + (3 - 1) *5 +8/2”并且计算值吗? 2. 后缀表达式 波兰科学家在20世纪50年代提出了一种将运算符放在数字后面的后缀表达式. 对应的,我们平时用的数学表达式叫做中缀表达式. 实例 5 + 3 => 5 3 + 1 + 2 * 3 => 1 2 3 * + 9 + ( 3–1 ) * 5 => 9 3 1–5 * + 中缀表达式符合人类的阅读和思维习惯:后缀表达式符合计算

C++--第22课 - 类模板 - 下

第22课 - 类模板 - 下 1. 类模板的局部特化 类模板可以定义多个类型参数 #include <cstdlib> #include <iostream> using namespace std; template<typename T1, typename T2> class Test { public: void add(T1 a, T2 b) { cout<<(a + b)<<endl; } }; int main(int argc,