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.hclass 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.mzph.cn/web/9774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux修炼之路之初识操作系统+基础指令(1)

目录 引言 一&#xff1a;对操作系统(OS)的简单了解 1.操作系统(OS) 是什么 2.操作系统好坏的衡量标准 3.操作系统存在的重要性 4.理解所有在计算机上的操作 二&#xff1a;Linux与windows操作的特点区别 三&#xff1a;基础指令 1.ls 指令 1.使用 2.常用选项 2.…

AI时代,为什么还要学习编程

在AI时代的浪潮之下&#xff0c;人工智能正逐渐渗透到我们生活的每一个角落&#xff0c;从自动化的客服系统到智能家居控制&#xff0c;再到先进的机器学习和数据分析技术。这一切进步无疑都在提问一个根本性问题&#xff1a;在AI如此先进的今天&#xff0c;为什么我们还需要学…

ICode国际青少年编程竞赛- Python-3级训练场-if else练习

ICode国际青少年编程竞赛- Python-3级训练场-if else练习 1、 for i in range(6):Dev.step(2)Dev.turnLeft()if i ! 1:Dev.step(2)Dev.step(-2)else:Dev.step(-3)Dev.step(3)Dev.turnRight()2、 Dev.step() for i in range(5):Dev.step(2)Dev.turnRight()if i < 1:Dev.s…

数电——集成计数器

分析 &#xff08;1&#xff09;74161 4位同步&#xff08;cp相同&#xff09;二进制&#xff0c;模16&#xff08;2的4次方&#xff09; 逻辑符号 端口 D0,D1,D2,D3为输入信号 Q0,Q1,Q2,Q3为输出信号 RCO输出进位标志&#xff1a;记满16个数后&#xff0c;输出1 P,T 控…

OpenHarmony 实战开发——编译4.0 bete2及master分支,添加参数--no-prebuilt-sdk跳过编译sdk

简介 用户应用程序泛指运行在设备的操作系统之上&#xff0c;为用户提供特定服务的程序&#xff0c;简称“应用”。一个应用所对应的软件包文件&#xff0c;称为“应用程序包”。 OpenHarmony 提供了应用程序包开发、安装、查询、更新、卸载的管理机制&#xff0c;方便开发者…

【SRC实战】合成类小游戏外挂漏洞

挖个洞先 https://mp.weixin.qq.com/s/ZnaRn222xJU0MQxWoRaiJg “以下漏洞均为实验靶场&#xff0c;如有雷同&#xff0c;纯属巧合” 合成类小游戏三个特点&#xff1a; 1、一关比一关难&#xff0c;可以参考“羊了个羊” 2、无限关卡无限奖励&#xff0c;可以参考“消灭星星…

java期末复习

java jdk jre jvm .java-------->.class----jvm---->机器语言 编写源文件 编译源文件生成字节码 加载运行字节码 java语句执行顺序 顺序 选择 循环 异常处理 基本语法 方法格式 权限修饰符 返回值声明 方法名称(参数列表){方法中封装的逻辑功能;return 返回值;}–权…

Python语言基础学习(上)

目录 一、常量和表达式 二、变量和类型 2.1 认识变量 2.2 定义变量 2.3 变量类型 1、整数 int 2、浮点数&#xff08;小数&#xff09;float 3、字符串 str 4、布尔类型 2.4 类型转换 三、注释 3.1 单行注释 3.2 文档注释&#xff08;或者多行注释&#xff09; …

QML配合VTK基本实现

采用 QT5.15 VTK9.2.0 建立QT QUICK项目 部分方法来源于 QML加载VTK main.cpp #include <QGuiApplication> #include <QQmlApplicationEngine>#include <QQuickVTKRenderWindow.h> #include <QQuickVTKRenderItem.h> #include <vtkPolyDataMapp…

[MRCTF2020]Ez_bypass1 and [网鼎杯 2020 青龙组]AreUSerialz1()php语言基础学习,以及序列化概念的基本了解

1.[MRCTF2020]Ez_bypass1 &#xff08;1&#xff09;打开环境后它是一串很长并且看起来非常混乱的代码&#xff0c;看不懂那咱就先不管&#xff0c;直接查看源码 &#xff08;2&#xff09;看了之后可以发现它涉及到很多东西 首先就是要进行一个仔细的代码审计&#xff0c;分…

Windows11 同时安装jdk8和jdk17 可切换

Windows11 同时安装jdk8和jdk17 可切换 死忠于JDK8的码农们&#xff0c;可能不得不做出一些改变的 因为在springboot3最低也是只能用17 并且最近如果创建springboot项目的时候&#xff0c;你会发现&#xff0c;最低也是17的 并且&#xff0c;如果使用springcloud开发&#x…

LeetCode 每日一题 ---- 【2105. 给植物浇水 II】

LeetCode 每日一题 ---- 【2105. 给植物浇水 II】 2105.给植物浇水II方法&#xff1a;模拟双指针 2105.给植物浇水II 方法&#xff1a;模拟双指针 今天是给植物浇水II&#xff0c;昨天是I&#xff0c;本质上和昨天的没有区别&#xff0c;都是模拟&#xff0c;今天额外需要注意…

网络相关指令linux指令该怎么使用 - telnet

Telnet 指令使用方法 Telnet 是一种用于远程登录服务器的协议。以下是一些常见的 Telnet 指令及其用途。 基本指令 telnet [主机名或IP地址] [端口] 功能&#xff1a;连接到指定的远程主机和端口。示例&#xff1a;telnet example.com 23 Telnet 内部指令 c - close 功能&…

Linux vscode push报错fatal: Authentication failed

注意啊&#xff0c;Git基于密码的身份验证已经被删除了&#xff0c;所以这个报错发生时无论密码正确与否&#xff0c;以及参考比较旧的改bug教程&#xff0c;都没法提交。进入提示的网址&#xff0c;生成个人访问令牌就好了

Vue中引入Element组件、路由router、Nginx打包部署

目录 1、Element-ui(饿了么ui) 演示&#xff1a; 怎么打开NPM脚本&#xff1f; Vue路由router Nginx打包部署Vue-Cli项目 1、Element-ui(饿了么ui) element-ui(饿了么ui)是一个非常好用且美观的组件库(插件库)&#xff0c;主要用于网站快速成型&#xff0c;由国产团队饿了么…

设置多用户远程登录windows server2016服务器

1、远程登录windows server 2016 运行—>mstsc—>远程IP地址—>用户和密码 2、远程windows服务器设置多用户策略 运行—>gpedit.msc->计算机配置—管理模板—windows组件—远程桌面服务—远程桌面会话主机----连接,如下图所示: 1、《限制连接的数量》设置为…

2024-AIDD-人工智能药物设计-基于深度学习的胶质母细胞瘤靶点蛋白的识别与药物设计

UniProt搜索胶质母细胞瘤相关蛋白&#xff1a;从UniProt数据库查找胶质母细胞瘤相关的蛋白质数据是一个很好的开始&#xff0c;这可以帮助你识别与疾病相关的关键蛋白。 疾病与中药交集分析&#xff1a;研究中药&#xff08;如益气解毒方&#xff09;与胶质母细胞瘤的关系&…

Mybatis高效批量插入实战:五种策略全面解析

在现代应用开发中&#xff0c;数据处理常常涉及大量数据的插入操作&#xff0c;特别是在数据迁移、日志记录、统计分析等场景中。Mybatis作为Java领域广泛使用的持久层框架&#xff0c;其批量插入功能对于提升数据插入效率至关重要。本文将深入探讨Mybatis实现批量插入的五种策…

网络安全基础

目录 概述 1. 需求 2. 密码学 3. 保密 4. 数字签名 5. 身份认证 6. 对称密钥分配及管理 7. 公钥认证及PKI 8. 网络安全协议标准 结语 概述 在当今数字化时代&#xff0c;网络安全是任何组织和个人都必须重视的重要问题。从个人隐私到商业机密&#xff0c;网络安全的基…

DenseCLIP论文讲解

文章目录 简介方法总体框架 &#xff08;Language-Guided Dense Prediction&#xff09;上下文感知提示 &#xff08;Context-Aware Prompting&#xff09;应用实例 论文&#xff1a;DenseCLIP: Language-Guided Dense Prediction with Context-Aware Prompting 代码&#xff1…