C++ 类和对象:面向对象编程基础

目录标题

      • 1. 什么是类?
      • 2. 什么是对象?
      • 3. 如何定义一个类?
      • 4. 如何创建对象?
      • 5. 类的构造函数
      • 6. 类的析构函数
      • 7. 数据封装和访问修饰符
      • 8. 示例:一个简单的`BankAccount`类
      • 9. 使用g++编译
      • 10. 再来一个简单的C++程序
      • 11. 定义书籍类 `Book`
      • 12. 实现书籍类的成员函数
      • 13. 使用书籍类
      • 14. 编译和运行
      • 15. 再来一个例子
      • 16. 定义账户类 `Account`
      • 17. 实现账户类 `Account`
      • 18. 定义银行类 `Bank`
      • 19. 实现银行类 `Bank`
      • 20. 使用`Account`和`Bank`类
      • 21. 编译和运行
      • 22. 拓展:std::string getTitle() const; 这里的std是什么意思?


面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它使用“对象”来设计软件。在C++中,对象是通过类来创建的。类是创建对象的蓝图或模板。

1. 什么是类?

类是一种用户定义的数据类型,它拥有数据成员和成员函数。数据成员用于存储与类相关的信息,而成员函数则用于操作这些数据。类可以看作创建对象的模板。

2. 什么是对象?

对象是类的实例。一旦定义了类,我们可以通过类创建对象,对象包含了类中定义的数据成员和成员函数。

3. 如何定义一个类?

C++中类的定义以关键字class开始,后跟类名和类体。类体包含在一对花括号中。通常,类的定义会放在头文件中,例如.h.hpp文件。

// BankAccount.h
class BankAccount {
public:
    // 构造函数
    BankAccount(double balance);
    // 成员函数
    void deposit(double amount);
    void withdraw(double amount);
    double getBalance() const;

private:
    // 数据成员
    double balance;
};

4. 如何创建对象?

创建类的对象非常简单,只需像声明普通变量一样声明对象即可。

BankAccount myAccount(50.0);

5. 类的构造函数

构造函数是一种特殊的成员函数,它在创建对象时自动调用。构造函数的名称与类名相同。

// BankAccount.cpp
BankAccount::BankAccount(double initialBalance) : balance(initialBalance) {
    if (initialBalance < 0) {
        balance = 0;
        // 报告错误:初始余额不能为负
    }
}

6. 类的析构函数

析构函数是另一种特殊的成员函数,它在对象销毁时自动调用。析构函数的名称是在类名前加上一个波浪号~

7. 数据封装和访问修饰符

封装是面向对象编程的一个重要特征,它防止了对对象内部的直接访问。在C++中,我们通过访问修饰符publicprotectedprivate来实现封装。

8. 示例:一个简单的BankAccount

让我们来看一个完整的例子,它定义了一个BankAccount类和相关的成员函数。

// BankAccount.h

class BankAccount {
public:
    BankAccount(double balance);
    void deposit(double amount);
    void withdraw(double amount);
    double getBalance() const;

private:
    double balance;
};

// BankAccount.cpp

#include "BankAccount.h"

BankAccount::BankAccount(double initialBalance) : balance(initialBalance) {
    if (initialBalance < 0) {
        balance = 0;
        // 报告错误:初始余额不能为负
    }
}

void BankAccount::deposit(double amount) {
    if (amount > 0) {
        balance += amount;
    } else {
        // 报告错误:存款金额必须大于0
    }
}

void BankAccount::withdraw(double amount) {
    if (amount > balance) {
        // 报告错误:不能透支账户
    } else {
        balance -= amount;
    }
}

double BankAccount::getBalance() const {
    return balance;
}

// main.cpp

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

int main() {
    BankAccount myAccount(100.0);
    myAccount.deposit(50.0);
    myAccount.withdraw(25.0);
    std::cout << "当前余额: $" << myAccount.getBalance() << std::endl;
    return 0;
}

在这个例子中,我们创建了一个BankAccount类,它有一个构造函数,两个操作余额的函数depositwithdraw,以及一个查询余额的函数getBalance。这个类的私有数据成员balance用于存储账户余额。


9. 使用g++编译

要使用g++编译上述示例,需要确保所有的源文件(.cpp)和头文件(.h)都在同一个目录下。

  1. 使用g++编译器编译BankAccount.cppmain.cpp文件。
g++ -c BankAccount.cpp
g++ -c main.cpp

这两个命令分别编译了BankAccount.cppmain.cpp文件,并生成了对应的目标文件(.o文件)。

  1. 接下来,链接这些目标文件以生成最终的可执行文件。使用以下命令:
g++ BankAccount.o main.o -o BankAccountApp

这个命令将BankAccount.omain.o文件链接在一起,并创建了一个名为BankAccountApp的可执行文件。

  1. 运行生成的可执行文件:
./BankAccountApp

如果一切顺利,应该会看到程序输出的当前余额。

完整的编译和运行命令序列如下:

g++ -c BankAccount.cpp
g++ -c main.cpp
g++ BankAccount.o main.o -o BankAccountApp
./BankAccountApp
当前余额: $125

如果希望一步完成编译和链接,可以使用以下命令:

g++ BankAccount.cpp main.cpp -o BankAccountApp

这个命令会同时编译和链接所有的.cpp文件,并生成一个名为BankAccountApp的可执行文件。然后,可以运行这个可执行文件来查看程序的输出。


10. 再来一个简单的C++程序

再创建一个简单的C++程序,这次我们将实现一个书籍类(Book)。这个类将包含一些基本属性,如标题、作者和出版年份,并提供一些成员函数来访问和修改这些属性。

11. 定义书籍类 Book

首先,我们将定义一个名为 Book 的类,它将具有三个私有成员:标题(title)、作者(author)和出版年份(publishYear)。我们还将提供公共函数来构造书籍、设置和获取这些属性。

// Book.h
#ifndef BOOK_H
#define BOOK_H

#include <string>

class Book {
public:
    // 构造函数
    Book(const std::string& title, const std::string& author, int publishYear);

    // 成员函数
    void setTitle(const std::string& title);
    void setAuthor(const std::string& author);
    void setPublishYear(int year);
    
    std::string getTitle() const;
    std::string getAuthor() const;
    int getPublishYear() const;

private:
    std::string title;
    std::string author;
    int publishYear;
};

#endif

12. 实现书籍类的成员函数

接下来,我们实现这个类的成员函数。这些函数包括构造函数、设置和获取属性的函数。

// Book.cpp
#include "Book.h"

Book::Book(const std::string& title, const std::string& author, int publishYear)
    : title(title), author(author), publishYear(publishYear) {}

void Book::setTitle(const std::string& title) {
    this->title = title;
}

void Book::setAuthor(const std::string& author) {
    this->author = author;
}

void Book::setPublishYear(int year) {
    this->publishYear = year;
}

std::string Book::getTitle() const {
    return title;
}

std::string Book::getAuthor() const {
    return author;
}

int Book::getPublishYear() const {
    return publishYear;
}

13. 使用书籍类

最后,我们将在 main 函数中创建和使用 Book 类的实例。

// main.cpp
#include <iostream>
#include "Book.h"

int main() {
    // 创建 Book 类的一个对象
    Book myBook("1984", "George Orwell", 1949);

    // 输出书籍信息
    std::cout << "Book: " << myBook.getTitle() << std::endl;
    std::cout << "Author: " << myBook.getAuthor() << std::endl;
    std::cout << "Publish Year: " << myBook.getPublishYear() << std::endl;

    // 修改书籍信息
    myBook.setTitle("Animal Farm");
    myBook.setAuthor("George Orwell");
    myBook.setPublishYear(1945);

    // 输出修改后的书籍信息
    std::cout << "Updated Book: " << myBook.getTitle() << std::endl;
    std::cout << "Updated Author: " << myBook.getAuthor() << std::endl;
    std::cout << "Updated Publish Year: " << myBook.getPublishYear() << std::endl;

    return 0;
}

14. 编译和运行

为了编译和运行这个程序,你可以使用类似之前的 g++ 命令:

g++ Book.cpp main.cpp -o BookApp
./BookApp
Book: 1984
Author: George Orwell
Publish Year: 1949
Updated Book: Animal Farm
Updated Author: George Orwell
Updated Publish Year: 1945

这会编译你的程序并生成一个可执行文件 BookApp,运行这个可执行文件将显示书籍信息和更新后的信息。


15. 再来一个例子

让我们设计一个更具交互性的例子,这次我们将创建一个简单的银行账户系统。这个系统会包含两个类:AccountBankAccount类将用于处理单个银行账户的基本信息和操作,如存款、取款和查询余额,而Bank类将管理多个账户并允许添加新账户。

16. 定义账户类 Account

首先,我们定义一个Account类,它包含账户的基本信息和操作。

// Account.h
#ifndef ACCOUNT_H
#define ACCOUNT_H

#include <string>

class Account {
public:
    Account(const std::string& owner, double balance);
    void deposit(double amount);
    bool withdraw(double amount);
    double getBalance() const;
    std::string getOwner() const;

private:
    std::string owner;
    double balance;
};

#endif

17. 实现账户类 Account

现在,我们来实现Account类的成员函数。

// Account.cpp
#include "Account.h"

Account::Account(const std::string& owner, double balance)
    : owner(owner), balance(balance) {}

void Account::deposit(double amount) {
    if (amount > 0) {
        balance += amount;
    }
}

bool Account::withdraw(double amount) {
    if (amount > 0 && amount <= balance) {
        balance -= amount;
        return true;
    }
    return false;
}

double Account::getBalance() const {
    return balance;
}

std::string Account::getOwner() const {
    return owner;
}

18. 定义银行类 Bank

接着,我们定义一个Bank类来管理多个Account

// Bank.h
#ifndef BANK_H
#define BANK_H

#include "Account.h"
#include <vector>

class Bank {
public:
    void addAccount(const Account& account);
    void printAccounts() const;

private:
    std::vector<Account> accounts;
};

#endif

19. 实现银行类 Bank

最后,我们实现Bank类的功能。

// Bank.cpp
#include "Bank.h"
#include <iostream>

void Bank::addAccount(const Account& account) {
    accounts.push_back(account);
}

void Bank::printAccounts() const {
    for (const auto& account : accounts) {
        std::cout << "Owner: " << account.getOwner() 
                  << ", Balance: $" << account.getBalance() << std::endl;
    }
}

20. 使用AccountBank

最后,我们在main函数中使用这些类。

// main.cpp
#include "Account.h"
#include "Bank.h"

int main() {
    Account a1("John Doe", 1000);
    Account a2("Jane Doe", 1500);
    
    Bank bank;
    bank.addAccount(a1);
    bank.addAccount(a2);
    
    bank.printAccounts();
    
    return 0;
}

21. 编译和运行

同样地,使用g++将这些文件编译成一个可执行文件:

g++ Account.cpp Bank.cpp main.cpp -o BankSystem
./BankSystem
Owner: John Doe, Balance: $1000
Owner: Jane Doe, Balance: $1500

运行这个指令后,你将看到输出的账户信息,这表明我们的简易银行系统能够管理多个账户并打印它们的信息。


22. 拓展:std::string getTitle() const; 这里的std是什么意思?

在C++中,std 是标准命名空间(standard namespace)的名称,它是由C++标准库定义的。命名空间是一种将全局作用域分割的机制,用于解决命名冲突的问题,特别是当不同的库可能包含相同名称的标识符时。

在C++中,标准库中的所有组件(如 std::stringstd::vectorstd::cout 等)都被定义在 std 命名空间中。因此,当你在代码中看到 std:: 前缀时,它表明你正在使用的标识符是标准库的一部分。

例如,std::string 是一个类,它提供了字符串的功能,而 std::cout 是一个对象,用于向标准输出流(通常是控制台)输出数据。

在你的代码示例中,std::string getTitle() const; 是一个成员函数声明,它返回一个 std::string 类型的值。这意味着 getTitle 函数将返回一个字符串,这个字符串是标准库中的 string 类型。const 关键字表示这个函数不会修改调用它的对象的状态,即它是一个“只读”函数。

当你在代码中使用标准库的组件时,你需要使用 std:: 前缀,除非你已经通过 using 指令导入了特定的名称到当前作用域中。例如:

#include <string> // 包含string头文件

// 使用std::string,因为还没有导入到当前作用域
void someFunction() {
    std::string myString = "Hello, world!";
}

// 使用using指令导入std::string到当前作用域
using std::string;

void anotherFunction() {
    string anotherString = "Another message!"; // 不需要std::前缀
}

anotherFunction 中,由于我们已经使用 using 指令导入了 std::string,所以可以直接使用 string 而不需要 std:: 前缀。然而,在 someFunction 中,我们没有导入 std::string,所以我们必须使用 std::string

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/611315.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

将AI融入项目开发工作中去吧

目录 1.提高编写开发日报的效率 2.提高编写代码注释的效率 3.提高代码重构的效率 4.编写测试用例及测试报告 5. 协助进行代码走查与工作量分析 在AI元年后&#xff0c;作为一名程序员&#xff0c;相信各位友友已经深切地感受到了它带来的变革。作为一个从小白到资深码农的…

canvas识别路线

theme: jzman 视频说明 jvideo 前言 效果一 技术栈 htmljavascriptcsscanvas 项目主要功能上传一张地图&#xff0c;或者迷宫地图&#xff0c;通过canvas的一系列操作&#xff0c;并指定一个起点和终点&#xff0c;并找到到达终点最近的路线 迷宫找出口效果 正文 加载图像 首先…

芋道系统springcloud模块启动报错,枚举类不能为空

问题描述&#xff1a; Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled. 2024-05-10 15:50:15.756 | ERROR 9120 | main [TID: N/A] o.s.b.d.LoggingFailureAnalysisReporter | ************************…

【C++】详细版 RAII技术的应用之智能指针(智能指针发展历程和简单模拟实现介绍)

目录 前言 一、智能指针有什么用&#xff1f; 二、什么是RAII(智能指针的底层思想)&#xff1f; 三、智能指针的发展历程以及模拟实现 1.auyo_ptr&#xff08;C98&#xff09; 2.unique_ptr&#xff08;C11&#xff09; 3.shared_ptr&#xff08;C11&#xff09; 前言 C中…

面向对象 03:类与对象的创建、初始化和使用,通过 new 关键字调用构造方法,以及创建对象过程的内存分析

一、前言 记录时间 [2024-05-10] 系列文章简摘&#xff1a; Java 笔记 01&#xff1a;Java 概述&#xff0c;MarkDown 常用语法整理 Java 笔记 11&#xff1a;Java 方法相关内容&#xff0c;方法的设计原则&#xff0c;以及方法的定义和调用 面向对象 01&#xff1a;Java 面向对…

使用com.google.common.collect依赖包中的Lists.transform()方法转换集合对象之后,修改集合中的对象属性,发现不生效

目录 1.1、错误描述 &#xff08;1&#xff09;引入依赖 &#xff08;2&#xff09;模拟代码 &#xff08;3&#xff09;运行结果 1.2、解决方案 1.1、错误描述 最近在开发过程中&#xff0c;使用到了com.google.common.collect依赖包&#xff0c;通过这个依赖包中提供的…

4D 成像毫米波雷达:新型传感器助力自动驾驶

1 感知是自动驾驶的首要环节&#xff0c;高性能传感器必不可少 感知环节负责对侦测、识别、跟踪目标&#xff0c;是自动驾驶实现的第一步。自动驾驶的实现&#xff0c;首先要能够准确理解驾驶环境信息&#xff0c;需要对交通主体、交通信号、环境物体等信息进行有效捕捉&#x…

2024-AIDD-人工智能药物设计-AlphaFold3

AlphaFold3&#xff5c;万字长文解读 AlphaFold3预测所有分子相互作用准确结构 AlphaFold3 自2021年AlphaFold2问世以来&#xff0c;科研工作者们便开始利用这一蛋白结构预测模型来详细描绘众多蛋白质的结构、探索新药。近日&#xff0c;Google DeepMind公司推出了其最新产品…

[附源码]石器时代_恐龙宝贝内购版_三网H5手游_带GM工具

石器时代之恐龙宝贝内购版_三网H5经典怀旧Q萌全网通手游_Linux服务端源码_视频架设教程_GM多功能授权后台_CDK授权后台 本教程仅限学习使用&#xff0c;禁止商用&#xff0c;一切后果与本人无关&#xff0c;此声明具有法律效应&#xff01;&#xff01;&#xff01;&#xff0…

《Python编程从入门到实践》day24

# 昨日知识点学习 创建外星人从一个到一行 # 主程序snipdef _create_fleet(self):"""创建外星人群"""# 创建一个外星人并计算一行可容纳多少个外星人# 外星人的间距为外星人的宽度alien Alien(self)alien_width alien.rect.widthavailable_sp…

Android 屏幕适配全攻略(上)-掌握屏幕单位,应对千变万化的设备

本文从 Android 开发中常见的长度单位 px、dp、sp 入手&#xff0c;详细介绍了它们的特点及转换关系。 接着深入探讨了屏幕尺寸、分辨率、像素密度等重要的屏幕指标&#xff0c;帮助读者全面理解它们之间的联系。最后&#xff0c;通过实例代码演示了如何在代码中进行单位转换&…

从头开始的建材类电商小程序开发指南

在当今数字化时代&#xff0c;小程序已经成为了许多企业推广和销售的重要渠道。对于建筑材料行业来说&#xff0c;开发一个属于自己的小程序商城不仅可以提升产品曝光度&#xff0c;还可以提供更好的用户购物体验。下面&#xff0c;我们将逐步教你如何开发建筑材料行业小程序。…

【c++算法篇】双指针(下)

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;算法笔记仓 朋友们大家好啊&#xff0c;本篇文章我们来到算法的双指针的第二部分 目录 1.有效三角形的个数2.查找总价格为目标值的两个商品3.三数之和4.四数之和5.双指针常见场景总结 1.有效三角形…

【Linux】Linux——Centos7安装Nginx

不需要安装包 1.安装依赖 #查看 C 环境是否安装gcc -v #查看 zlib 是否安装cat /usr/lib64/pkgconfig/zlib.pc #查看 pcre 是否安装pcre-config --version 2.安装C #安装C yum install gcc-c 3.安装pcre yum install -y pcre pcre-devel 4.安装zlib #安装 yum install -y zlib…

西米支付:数字藏品元宇宙的介绍与骗局套路解析

一、什么是元宇宙&#xff1f; 元宇宙是一个集体虚拟共享空间&#xff0c;由虚拟增强的物理现实和物理持久的虚拟空间融合而创造&#xff0c;包括所有虚拟世界、增强现实和互联网的总和。简单地说&#xff0c;元宇宙是Web3.0时期的数字世界。 这类新兴概念被非法分子包装后&am…

libssh C++封装之六(Dir)

1 概述 libssh是一个在客户端和服务器端实现SSHv2协议的多平台C库。使用libssh,您可以远程执行程序、传输文件、使用安全透明的隧道、管理公钥等等。本文描述的对libssh客户端功能的C++封装。 libssh下载地址 3 实现 3.5 Dir Dir类型管理远程路径,通过SFTP和Channel实现(有…

Java入门基础学习笔记14——数据类型转换

类型转换&#xff1a; 1、存在某种类型的变量赋值给另一种类型的变量&#xff1b; 2、存在不同类型的数据一起运算。 自动类型转换&#xff1a; 类型范围小的变量&#xff0c;可以直接赋值给类型范围大的变量。 byte类型赋值给int类型&#xff0c;就是自动类型转换。 pack…

20240503安装HEVC解码器播放H265格式的8K视频

20240503安装HEVC解码器播放H265格式的8K视频 2024/5/3 9:55 缘起&#xff1a;由于youtube支持8K视频了&#xff0c;想尝尝鲜&#xff01; 主摄像头当然是选择SONY的【夜摄/弱光场景】&#xff0c;根据优选&#xff0c;小米&#xff08;MI&#xff09;13Ultra 最佳了。 在开始播…

什么是SOL链跟单机器人与阻击机器人?

SOL链作为一个快速增长的区块链生态系统&#xff0c;为各种应用程序提供了丰富的发展机会。在SOL链上&#xff0c;智能合约的应用已经开始蓬勃发展&#xff0c;其中包括了许多与加密货币交易相关的应用。在本文中&#xff0c;我们将介绍在SOL链上开发的阻击机器人&#xff08;S…