C++的对象和类

这篇具有很好参考价值的文章主要介绍了C++的对象和类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、问题引入

区分面向过程编程和面向对象编程的最大的特性就是 ,类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操纵数据的方法组合成一个整洁的包。

那么如何声明类、定义类、调用类?

C++ Primer Plus:中文版 (第六版) 的股票类举例说明。

二、解决过程

2-1 类抽象

股票类的抽象化

  • 获得股票

  • 增持股票

  • 减持股票

  • 更新股票价格

  • 显示所持股票的信息

股票的数据类型抽象化

  • 发行股票公司名称

  • 所持股票的数量

  • 股票的单价

  • 股票总值

2-2 类的代码实现

1️⃣ stock.h

#ifndef __STOCK_H__
#define __STOCK_H__

#include <string>

// 类的声明
class Stock {
public:
    Stock(); // default constructor
    Stock(const std::string & co, long n = 0, double pr = 0.0); // constructor prototype with some default arguments
    ~Stock(); // noisy destructor

    void get_stock(const std::string & co, long n, double pr);  // 获得股票
    void add_stock(long num, double price);                     // 增持股票
    void sell_stock(long num, double price);                    // 减持股票
    void update_price(double price);                            // 更新股票价格
    void show();                                                // 显示所持股票的信息

private:
    std::string company; // 发行股票公司名称
    long shares;         // 所持股票的数量
    double share_val;    // 股票的单价
    double total_val;    // 股票总值
    void set_total() {total_val = shares * share_val;};
};

#endif

2️⃣ stock.cpp

#include "stock.h"
#include <iostream>

// default constructor
Stock::Stock()
{
    company = "no name";
    shares = 0;
    share_val = 0.0;
    total_val = 0.0;
}

// class destructor
Stock::~Stock() // verbose class destructor
{

}
// 构造函数的参数表示的不是类成员,而是赋给类成员的值。因此,参数名不能与类成员相同,否则出现同名混乱
Stock::Stock(const std::string & co, long n, double pr) 
{
    company = co;
    if(n < 0)
    {
        std::cerr << "Number of shares can't be negative; "
                  << company << " shares set to 0.\n";
        shares = 0;
    }
    else
        shares = n;
    share_val = pr;
    set_total();
}

/* other methods */

void Stock::get_stock(const std::string & co, long n, double pr) 
{
    company = co;
    if(n < 0)
    {
        std::cout << "Number of shares can't be negative; "
                  << company << " shares set to 0.\n";
        shares = 0;
    }
    else
        shares = n;
    share_val = pr;
    set_total();
}

void Stock::add_stock(long num, double price) 
{
    if(num < 0)
    {
        std::cout << "Number of shares purchased can't be negative. "
                  << "Transaction is aborted.\n";
    }
    else
    {
        shares += num;
        share_val = price;
        set_total();
    }
}

void Stock::sell_stock(long num, double price) 
{
    using std::cout;
    if(num < 0)
    {
        cout << "Number of shares sold can't be negative. "
             << "Transaction is aborted.\n";
    }
    else if(num > shares)
    {
        cout << "You can't sell more than you have! "
             << "Transaction is aborted.\n";
    }
    else
    {
        shares -=num;
        share_val = price;
        set_total();
    }
}

void Stock::update_price(double price) 
{
    share_val = price;
    set_total();
}

void Stock::show() 
{
    using std::cout;
    using std::endl;
    using std::ios_base;
    // set format to #.###
    ios_base::fmtflags orig = cout.setf(ios_base::fixed, ios_base::floatfield);
    std::streamsize prec = cout.precision(3);

    cout << "Stock Information:" << endl;
    cout << "Company company: " << company << endl;
    cout << "Number of Stocks: " << shares << endl;
    cout << "Price per Stock: $" << share_val<< endl;

    // set format to #.##
    cout.precision(2);
    cout << "Total Value: $" << total_val<< endl;

    // restore original format
    cout.setf(orig, ios_base::floatfield);
    cout.precision(prec);
}

3️⃣ stock_call.cpp

#include <iostream>
#include "..\inc\stock.h"

int main(void)
{
    Stock fluffy_the_cat("NanoSmart", 0, 0.0);
    fluffy_the_cat.get_stock("NanoSmart", 20, 12.50);
    fluffy_the_cat.show();
    std::cout << '\n';

    fluffy_the_cat.add_stock(15, 18.125);
    fluffy_the_cat.show();
    std::cout << '\n';

    fluffy_the_cat.sell_stock(400, 20);
    fluffy_the_cat.show();
    std::cout << '\n';

    fluffy_the_cat.add_stock(300000, 40.125);
    fluffy_the_cat.show();
    std::cout << '\n';

    fluffy_the_cat.sell_stock(300000, 0.125);
    fluffy_the_cat.show();

    return 0;
}

运行结果

C++的对象和类

2-3 类的构造函数和析构函数

构造函数:类的特殊成员函数,专门用于构造新对象、将值赋给类的数据成员

  • 构造函数的名称和类名称相同

  • 构造函数没有返回值

  • 一个类至少有一个构造函数,但一般会有多个构造函数:默认构造函数、拷贝构造函数、赋值构造函数

/* 默认构造函数没有参数 */
Stock(); // default constructor

/* 用户定义构造函数可以有参数或有部分参数 */
Stock(const std::string & co, long n = 0, double pr = 0.0); // constructor prototype with some default arguments

析构函数:类的特殊成员函数,专门用于销毁过期对象的内存

  • 构造函数的名称和类名称相同,但需要在名字前添加符号:~

  • 一个类有且只有析构函数

  • 析构函数无参数,也无返回值

~Stock(); // noisy destructor

2-4 同类的的比较

若用户希望根据类的某一个值进行比较,返回值较大的类,该如何实现。

在类的公共接口新增方法即可,此处以股票类举例:

stock.h

// 类的声明
class Stock {
public:
    // 此处省略重复信息
    const Stock & top_val(const Stock & s) const;               // 比较两只股票总值,得到总值较大的一只 

private:
    // 此处省略重复信息
};

stock.cpp

// 此处省略重复信息

 const Stock & Stock::top_val(const Stock & s) const
 {
    if (s.total_val > total_val)
        return s;
    else
        return *this;    
 }

main()

#include <iostream>
#include "..\inc\stock.h"

int main(void)
{
    Stock google, intel;
    google.get_stock("google", 100, 120);
    google.show();
    std::cout << '\n';

    intel.get_stock("intel", 100, 150);
    intel.show();
    std::cout << '\n';
    
    Stock top = google.top_val(intel);
    top.show();
    std::cout << '\n';

    return 0;
}

C++的对象和类

三、反思总结

一般来说,类规范由两部分组成。

  • 类声明:以数据成员的方式描述数据部分,以成员函数(即方法)的方式描述公有接口

  • 类方法定义:描述如何实现类成员函数

关于函数:const Stock & top_val(const Stock & s) const; 的理解

第一个 const :由于该函数返回了两个const 对象之一的引用,因此返回类型也应为const应用

第二个 const :该函数不会修改被显示地访问的对象(即 s)

第三个 const :该函数不会修改被隐式地访问的对象

this 指针指向用来调用成员函数的对象(this 被作为隐藏参数传递给方法)

四、参考引用

C++ Primer Plus:中文版 (第六版)文章来源地址https://www.toymoban.com/news/detail-412333.html

到了这里,关于C++的对象和类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++ 递归与面向对象编程基础

    递归是一种使函数调用自身的技术。这种技术提供了一种将复杂问题分解为简单问题的方法,从而更容易解决问题。 递归可能有点难以理解。理解其工作原理的最佳方法是通过实验来尝试。 将两个数字相加很容易做到,但将一系列数字相加就更复杂了。在下面的示例中,通

    2024年04月16日
    浏览(37)
  • 【C++】面向对象编程(二)面向对象的编程思维:virtual虚拟调用、继承、protected成员、派生类与基类

    默认情形下,成员函数的解析都是编译时静态进行。如果要让成员函数的解析在程序运行时动态进行,需要在成员函数的声明前加上virtual: 虚函数的作用: 用基类的指针指向不同的派生类的对象时,基类指针调用其虚成员函数,会调用 真正指向对象的成员函数 ,而

    2024年02月07日
    浏览(44)
  • c、c++、java、python、js对比【面向对象、过程;解释、编译语言;封装、继承、多态】

    目录 内存管理、适用 区别 C 手动内存管理:C语言没有内置的安全检查机制,容易出现内存泄漏、缓冲区溢出等安全问题。 适用于系统级编程 C++ 手动内存管理:C++需要程序员手动管理内存,包括分配和释放内存,这可能导致内存泄漏和指针错误。 适用于游戏引擎和系统级编

    2024年02月08日
    浏览(73)
  • C++的对象和类

    区分面向过程编程和面向对象编程的最大的特性就是 类 ,类是一种将抽象转换为用户定义类型的C++工具,它将数据表示和操纵数据的方法组合成一个整洁的包。 那么如何声明类、定义类、调用类? 以 C++ Primer Plus:中文版 (第六版) 的股票类举例说明。 股票类的抽象化 获得

    2023年04月13日
    浏览(25)
  • 【C++初阶】三、类和对象(面向过程、class类、类的访问限定符和封装、类的实例化、类对象模型、this指针)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【C++初阶】二、入门知识讲解 (引用、内联函数、auto、基于范围的for循环、指针空值

    2024年02月04日
    浏览(37)
  • 【Java编程教程】详解Java 中的对象和类

    在本页中,我们将了解 Java 对象和类。在面向对象的编程技术中,我们使用对象和类来设计程序。 Java中的对象既是物理实体又是逻辑实体,而Java中的类只是逻辑实体。 具有状态和行为的实体称为对象,例如椅子、自行车、记号笔、笔、桌子、汽车等。它可以是物理的或逻辑

    2024年02月16日
    浏览(36)
  • 【TensorRT】c++使用面向对象来封装tensorRT推理代码的指针释放问题

    初始化模型 这里可以看到我用了智能指针来分别定义_engine, _runtime, _context。并且我在头文件中定义了一个类来封装我的推理代码,包括初始化模型的步骤: 类封装 在这里可以看到,我已经将_engine, _runtime, _context都定义在了类的成员变量当中,并且都用的智能指针shared_ptr的方

    2024年01月18日
    浏览(44)
  • C++设计模式_21_Iterator 迭代器(理解;面向对象的迭代器已过时;C++中使用泛型编程的方式实现)

    Iterator 迭代器也是属于“数据结构”模式。 GoF中面向对象的迭代器已经过时,C++中目前使用泛型编程的方式实现,其他语言还在使用面向对象的迭代器。 在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以

    2024年02月07日
    浏览(54)
  • C++高级编程02-函数重载和类的封装

    目录 1、内联函数 2、函数的默认参数和占位参数 4、函数的重载  5、extern C 浅析 6、封装  内联函数引出---宏缺陷 宏缺陷: 必须要加括号保证运算完整 即使加括号,有些运算依然与预期结果不符 普通函数不会出现缺陷 C++提供 内联函数代替宏函数 inline 在函数声明和

    2024年02月12日
    浏览(27)
  • 设计模式学习笔记 - 面向对象 - 3.面向对象比面向过程有哪些优势?面向过程真的过时了吗?

    在过往的工作中,我发现很多人搞不清面向对象和面向过程的区别,总认为使用面向对象编程语言来开发,就是在面向面向对象编程了。而实际上,他们只是在用面向对象编程语言,编写面向过程风格的代码而已,并没有发挥面向对象编程的优势。这就相当于手握一把屠龙刀

    2024年02月22日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包