• C++ 封装-构造和析构


    • 1.构造和析构

      • 构造函数与析构函数
        • 默认构造函数
          • People a;
          • People* p = new People();
        • People(string name);
          • People a("tra");
          • People* p = new People("tra);
        • People(const People &a)
          • 拷贝构造,与=不等价
        • ~People();
      • 对象与引用
        • People a;
        • People &b = a;
      • malloc 与 new
        • malloc:分配内存
        • free:释放内存
        • new:分配内存,调用构造函数
        • delete:释放内存,调用析构函数
      • 构造其他用法
        • =delete
        • =default
        • explicit
        • 深拷贝
    • 2.三五法则

      • 1.需要析构函数的类也需要拷贝构造函数和拷贝赋值函数。
      • 2.需要拷贝操作的类也需要赋值操作,反之亦然。
      • 3.析构函数不能是删除的。
      • 4.如果一个类有删除的或不可访问的析构函数,那么其默认和拷贝构造函数会被定义为删除的。
      • 5.如果一个类有const或引用成员,则不能使用合成的拷贝赋值操作。
    • 3.static

      • 类属性
        • static int total_num;
      • 类方法
        • static People* create();
    • 4.Task

    1. #include <iostream>
    2. #include <string>
    3. using namespace std;
    4. class People
    5. {
    6. private:
    7. string name;
    8. int age;
    9. float height;
    10. float weight;
    11. private:
    12. //People() = delete;
    13. //~People() = delete;
    14. //People() {};
    15. //~People() {};
    16. People(): name("master"),age(0),height(0),weight(0) {
    17. };
    18. ~People() {
    19. };
    20. public:
    21. static int count;
    22. static People* create() {
    23. People::count++;
    24. return new People();
    25. }
    26. static void release(People* p) {
    27. delete p;
    28. }
    29. };
    30. int People::count = 0;
    31. int main() {
    32. //People p; //错误,不允许构造
    33. cout << People::count << endl; //输出0
    34. People* p1 = People::create(); //可以
    35. cout << People::count << endl; //输出1
    36. //delete p1; //错误
    37. People::release(p1); //正确释放
    38. return 0;
    39. }
    • 5.mutable VS const

      • 常量方法访问常量或者用mutable
      • const方法修改成员属性 用mutable
      • const不能修改静态方法,可以修饰静态属性
        • const方法: string& getName() const;
    • 6.设计图书类

    1. #include <iostream>
    2. #include <vector>
    3. #include <algorithm>
    4. #include <string>
    5. using namespace std;
    6. class CBook{
    7. private:
    8. string _name;
    9. int _price;
    10. public:
    11. CBook(const char* name, int price) : _name(name), _price(price) {
    12. }
    13. inline string name() {return _name;}
    14. inline int price() {return _price;}
    15. virtual string desc() = 0;
    16. };
    17. class CComputer: public CBook {
    18. private:
    19. string _desc;
    20. public:
    21. CComputer(const char* name, int price, const char* desc) : CBook(name, price), _desc(desc){
    22. }
    23. string desc(){return _desc;}
    24. };
    25. class CHistory : public CBook{
    26. private:
    27. string _date;
    28. public:
    29. CHistory(const char* name, int price, const char* date) : CBook(name, price), _date(date){
    30. }
    31. string desc(){return "日期:" + _date;}
    32. };
    33. class CLib{
    34. private:
    35. vector<CBook*> _books;
    36. public:
    37. void addBook(CBook* book) {
    38. _books.push_back(book);
    39. }
    40. void listBooks() {
    41. for (auto book: _books) {
    42. cout << book->name() << " " << book->desc() << endl;
    43. }
    44. }
    45. void listBooksOrdByPrice() {
    46. sort(_books.begin(), _books.end(), [](CBook* a, CBook* b){
    47. return a->price() > b->price();
    48. });
    49. for(auto book : _books) {
    50. cout << book->name() << " " << book->price() << endl;
    51. }
    52. }
    53. };
    54. int main() {
    55. CLib lib;
    56. lib.addBook(new CComputer("C++", 55, "c++程序设计"));
    57. lib.addBook(new CComputer("C语言", 66, "c程序设计"));
    58. lib.addBook(new CComputer("Java", 140, "java程序设计"));
    59. lib.addBook(new CComputer("历史", 40, "中国历史教程"));
    60. lib.listBooks();
    61. cout << "------------" << endl;
    62. lib.listBooksOrdByPrice();
    63. return 0;
    64. }

  • 相关阅读:
    Java多线程开发CompletableFuture的应用
    【附源码】Python计算机毕业设计面向新疆人文旅游的自动问答系统
    Linux 操作系统中如何检查系统的启动和关机日志
    YOLO算法改进5【中阶改进篇】:添加SENet注意力机制
    八、T100应付管理系统之员工费用报销管理篇
    API测试基础之http协议
    C语言查找幸运数字(ZZULIOJ1056:幸运数字)
    第20天:信息打点-红蓝队自动化项目&资产侦察&企查产权&武器库部署&网络空间
    Oracle中的索引碎片
    Geotools实现shape文件的写入
  • 原文地址:https://blog.csdn.net/u011616934/article/details/125436147