C

C++类基本操作

admin 默认分类 2025-03-27
#include <iostream>
#include <string>

/* 使用命名空间封装计算器工具类,避免命名冲突 */
namespace MathTools {

/*
 * @brief 简单计算器类
 * 
 * 该类演示了C++类的基本特性,包括构造函数、析构函数、
 * 成员函数、静态成员、运算符重载等。
 */
class SimpleCalculator {
private:
    std::string name;    /* 计算器名称(普通成员变量) */
    int id;              /* 计算器ID(普通成员变量) */
    static int instanceCount;  /* 静态成员变量,记录实例数量 */

public:
    /* 构造函数声明 ======================== */
    
    /*
     * @brief 默认构造函数
     */
    SimpleCalculator();
    
    /*
     * @brief 带参数的构造函数
     * @param name 计算器名称
     * @param id 计算器ID
     */
    SimpleCalculator(const std::string& name, int id);
    
    /*
     * @brief 析构函数
     */
    ~SimpleCalculator();

    /* 成员函数声明 ======================== */
    
    /*
     * @brief 显示计算器信息
     */
    void display() const;
    
    /*
     * @brief 设置计算器名称
     * @param newName 新的计算器名称
     */
    void setName(const std::string& newName);
    
    /* 函数重载声明 ======================== */
    
    /*
     * @brief 整数加法
     * @param a 第一个加数
     * @param b 第二个加数
     * @return 两数之和
     */
    int add(int a, int b) const;
    
    /*
     * @brief 浮点数加法
     * @param a 第一个加数
     * @param b 第二个加数
     * @return 两数之和
     */
    double add(double a, double b) const;
    
    /*
     * @brief 字符串连接
     * @param a 第一个字符串
     * @param b 第二个字符串
     * @return 连接后的字符串
     */
    std::string add(const std::string& a, const std::string& b) const;
    
    /* 运算符重载声明 ====================== */
    
    /*
     * @brief 加法运算符重载(合并两个计算器)
     * @param other 另一个计算器对象
     * @return 合并后的新计算器对象
     */
    SimpleCalculator operator+(const SimpleCalculator& other) const;
    
    /*
     * @brief 赋值运算符重载
     * @param other 另一个计算器对象
     * @return 当前对象的引用
     */
    SimpleCalculator& operator=(const SimpleCalculator& other);
    
    /*
     * @brief 输出运算符重载(友元函数)
     */
    friend std::ostream& operator<<(std::ostream& os, const SimpleCalculator& calc);
    
    /* 静态成员函数声明 ==================== */
    
    /*
     * @brief 获取当前实例数量
     * @return 实例数量
     */
    static int getInstanceCount();
    
    /*
     * @brief 重置实例计数器
     */
    static void resetInstanceCount();
};

/* 静态成员变量初始化(必须在类外定义) */
int SimpleCalculator::instanceCount = 0;

/* 构造函数实现 ============================ */

SimpleCalculator::SimpleCalculator() : name("Default"), id(0) {
    instanceCount++;
    std::cout << "默认构造函数被调用。当前实例数: " 
              << instanceCount << std::endl;
}

SimpleCalculator::SimpleCalculator(const std::string& name, int id) 
    : name(name), id(id) {
    instanceCount++;
    std::cout << "带参数构造函数被调用。当前实例数: " 
              << instanceCount << std::endl;
}

/* 析构函数实现 ============================ */

SimpleCalculator::~SimpleCalculator() {
    instanceCount--;
    std::cout << "析构函数被调用 [" << name 
              << "]。剩余实例数: " << instanceCount << std::endl;
}

/* 成员函数实现 ============================ */

void SimpleCalculator::display() const {
    std::cout << "计算器信息 - 名称: " << name 
              << ", ID: " << id << std::endl;
}

void SimpleCalculator::setName(const std::string& newName) {
    name = newName;
}

/* 函数重载实现 ============================ */

int SimpleCalculator::add(int a, int b) const {
    return a + b;
}

double SimpleCalculator::add(double a, double b) const {
    return a + b;
}

std::string SimpleCalculator::add(const std::string& a, const std::string& b) const {
    return a + b;
}

/* 运算符重载实现 ========================== */

SimpleCalculator SimpleCalculator::operator+(const SimpleCalculator& other) const {
    SimpleCalculator result;  /* 创建临时对象 */
    result.name = this->name + "+" + other.name;  /* 合并名称 */
    result.id = this->id + other.id;             /* 合并ID */
    return result;
}

SimpleCalculator& SimpleCalculator::operator=(const SimpleCalculator& other) {
    /* 检查自赋值 */
    if (this != &other) {
        name = other.name;
        id = other.id;
    }
    return *this;  /* 返回当前对象的引用 */
}

/* 友元函数实现 */
std::ostream& operator<<(std::ostream& os, const SimpleCalculator& calc) {
    os << "计算器[" << calc.name << " #" << calc.id << "]";
    return os;
}

/* 静态成员函数实现 ======================== */

int SimpleCalculator::getInstanceCount() {
    return instanceCount;
}

void SimpleCalculator::resetInstanceCount() {
    instanceCount = 0;
}

} /* namespace MathTools */

/*
 * @brief 主函数 - 测试SimpleCalculator类的各种功能
 */
int main() {
    using namespace MathTools;
    
    std::cout << "\n===== 测试默认构造函数 =====" << std::endl;
    SimpleCalculator calc1;
    calc1.display();
    
    std::cout << "\n===== 测试带参数构造函数 =====" << std::endl;
    SimpleCalculator calc2("科学计算器", 1001);
    calc2.display();
    
    std::cout << "\n===== 测试函数重载 =====" << std::endl;
    std::cout << "整数加法: " << calc1.add(5, 3) << std::endl;
    std::cout << "浮点数加法: " << calc1.add(2.5, 3.7) << std::endl;
    std::cout << "字符串连接: " << calc1.add("你好", "世界") << std::endl;
    
    std::cout << "\n===== 测试运算符重载 =====" << std::endl;
    SimpleCalculator calc3 = calc1 + calc2;
    std::cout << "calc1 + calc2 = " << calc3 << std::endl;
    
    std::cout << "\n===== 测试静态成员函数 =====" << std::endl;
    std::cout << "当前实例数: " << SimpleCalculator::getInstanceCount() << std::endl;
    
    {
        std::cout << "\n===== 进入内部作用域 =====" << std::endl;
        SimpleCalculator calc4("图形计算器", 2002);
        std::cout << "内部作用域实例数: " 
                  << SimpleCalculator::getInstanceCount() << std::endl;
        std::cout << "===== 退出内部作用域 =====" << std::endl;
    }
    
    std::cout << "\n外部作用域实例数: " 
              << SimpleCalculator::getInstanceCount() << std::endl;
    
    std::cout << "\n===== 测试重置静态计数器 =====" << std::endl;
    SimpleCalculator::resetInstanceCount();
    std::cout << "重置后实例数: " 
              << SimpleCalculator::getInstanceCount() << std::endl;
    
    return 0;
}

输出如下:
===== 测试默认构造函数 =====
默认构造函数被调用。当前实例数: 1
计算器信息 - 名称: Default, ID: 0

===== 测试带参数构造函数 =====
带参数构造函数被调用。当前实例数: 2
计算器信息 - 名称: 科学计算器, ID: 1001

===== 测试函数重载 =====
整数加法: 8
浮点数加法: 6.2
字符串连接: 你好世界

===== 测试运算符重载 =====
默认构造函数被调用。当前实例数: 3
calc1 + calc2 = 计算器[Default+科学计算器 #1001]

===== 测试静态成员函数 =====
当前实例数: 3

===== 进入内部作用域 =====
带参数构造函数被调用。当前实例数: 4
内部作用域实例数: 4
===== 退出内部作用域 =====
析构函数被调用 [图形计算器]。剩余实例数: 3

外部作用域实例数: 3

===== 测试重置静态计数器 =====
重置后实例数: 0
析构函数被调用 [Default+科学计算器]。剩余实例数: -1
析构函数被调用 [科学计算器]。剩余实例数: -2
析构函数被调用 [Default]。剩余实例数: -3

评论(120)

发布评论
  1. 特工狂花2蜜桃杀机

  2. 最后的晚餐

  3. 特工狂花2蜜桃杀机

  4. 最后的晚餐

  5. 蒂姆洛里斯TimLoulies蜜袋鼯

  6. 世界将颤抖

  7. rap出一片天

  8. 新河东狮吼

  9. 黑白潜行2

  10. 我机器人

  11. 汤姆与杰瑞遇见福尔摩斯

  12. 美少女战士r剧场花朵的约定

  13. 舞台姊妹1964

  14. 天涯芬芳

  15. 地狱来的女人

  16. 黄金诡事录

  17. dj特工

  18. 亲爱的达令

  19. 凤楼传之灵狐传说

  20. 三人冷水澡

  21. 山海战纪之狂兽逆袭

  22. 古董计中计之龙璧之战

  23. MLB休息室波士顿红袜队的一年

  24. 相扑男孩

  25. 朱莉亚赖克特一步一脚印

  26. 长江7号超萌特攻队

  27. 狮子王生生不息演唱会

  28. 塞伦盖蒂第三季

  29. 爸不得找到你

  30. 尸妖

  31. 物种起源

  32. 人生路不熟

  33. 校园神探

  34. 凶杀重案实录纽约第二季

  35. 瓜棚女杰

  36. 传送法

  37. 无法阻止

  38. 不老奇事

  39. 环游地球八十天

  40. 亨利休格的神奇故事

  41. 私家侦探

  42. 永恒之旅

  43. 稍后见汉娜

  44. 疾速狂奔

  45. 15年

  46. 埃里克詹森警察还是毒枭

  47. 戒色师

  48. 木匠的祈祷

  49. 尸检6死者的秘密

  50. 远离迷幻2

  51. 红鬼仔

  52. 看门人

  53. 永久居留

  54. 天涯芬芳

  55. 生于一九四七爱情仍在继续

  56. 柠檬糖的魔法

  57. 惊爆十三天

  58. 一念之痒

  59. 新假面骑士

  60. 塞伦盖蒂

  61. 金太狼的幸福生活

  62. 阿赫德的膝盖

  63. 象牙山车神

  64. 阴目侦信

  65. 眼镜里的海

  66. 关于雨的问题

  67. 编号17

  68. 桑苏扎德克内迪梅

  69. 狂刀

  70. 聊斋志异之瞳人语

  71. 狙击精英幽灵射手

  72. 拉姆齐范德堡案件

  73. 阿赫德的膝盖

  74. 蜈蚣咒

  75. 猛鬼村

  76. 当代奸雄

  77. 刺梨花开

  78. 失控快递

  79. 济公之英雄归位

  80. 护国密探

  81. 方世玉粤配

  82. 烈焰英雄

  83. 无限逆境之末班地铁

  84. 小教父

  85. 这个杀手不太冷静

  86. 一路惊喜

  87. 自由时间

  88. 降妖功德簿

  89. 阿尔泽

  90. 飞来横财

  91. 稍后见汉娜

  92. 梦想之城

  93. 少女不毕业

  94. 凤楼传之灵狐传说

  95. 诡摇铃

  96. 破地狱

  97. 红灯停绿灯行

  98. 暗夜女妖

  99. 监控高中

  100. 校园神探

  101. 不一样的夏天

  102. 古董计中计之龙璧之战

  103. 神探李奥

  104. 卧底费瑞崛起

  105. 拿针的女孩

  106. 亡命救护车

  107. 军情五处利益之争

  108. 狄仁杰之夺命妖僧

  109. 夺魂异阵图

  110. 惊天追踪

  111. 天后传

  112. 扭曲的奉献

  113. 普林格拉

  114. 不在乎的微妙艺术

  115. 狂热追踪泰根和萨拉的冒名骗

  116. 杀死托尼笑不死偿命

  117. 肚假情真

  118. 哨兵