• C++ 教程 - 07 类的静态成员


    静态成员

    • 使用static修饰的成员;

    • 静态的成员变量

      • 仅保留一份副本,不管创建多少个实例对象,都共享这一份数据;
      • 类、对象均可以调用;
      • 类外重新声明,并通过类初始化;
    • 静态的成员函数;

      • static修饰
      • 没有this指针;
      • 类、对象均可访问
      • 静态的函数只能访问静态的成员或者类外的函数;
      • 不使用const修饰为常量成员函数;
        在这里插入图片描述
    #include 
    #include 
    using namespace std;
    
    
    //
    class People {
    public:
    	int age; // 实例成员变量,每个对象均有一个副本
    	string name; // 实例成员变量
    
    	static int objNum; // 静态成员变量, 仅有一个副本,所有的对象共享
    
    	People() { 
    		this->objNum++;
    	}
    
    	// 重载构造方法 参数列表不同
    	People(const int& age, const string& name):age(age), name(name) { // 参数列表初始化
    		this->objNum++;
    	}
    
    	static int& getObjNum() { // 类内定义为内联函数
    		return objNum; // 静态方法 只能访问静态的成员,且无this指针
    	}
    };
    
    // 类外(全局)初始化 静态变量 
    int People::objNum = 0;
    
    
    int main() {
    
    	People p(20, "jack");
    	People p1;
    	cout << p.getObjNum() << endl;
    
    	return 0;
    }
    

     

    函数重载

    • 同一个类内,同名函数,但不同的参数列表(参考上例的重载构造函数);
    • 根据实际参数类型,选择需要调用的方法;
    • 函数重写,发生在父类与子类之间,子类继承的父类中的方法可以重新实现函数体逻辑,一般重写父类中的虚函数(virtual 关键字修饰);

     

    重载运算符

    • 在类内部,使用operator关键字重载运算符,如operator+,表示重载相加的运算符;
    • 运算符的重载本质是函数;相当于python中的魔法方法重写;
    #include 
    #include 
    using namespace std;
    
    
    //
    class People {
    public:
    	int age; // 实例成员变量,每个对象均有一个副本
    	string name; // 实例成员变量
    	People() {}
    	People(const int& age, const string& name):age(age),name(name) {}
    	virtual ~People() {}
    
    	// 重载+运算符,本质是函数
    	const People& operator+(const People& p) {
    		People p1;
    		p1.age = this->age + p.age;
    		return p1;
    	}
    
    	// 
    	
    };
    
    
    int main() {
    
    	People p1(20, "jack"), p2(12, "lili");
    
    	People p3;
    	p3 = p1 + p2; // 重载运算符调用
    
    	cout << p3.age << endl;
    
    	return 0;
    }
    

    其他可重载的运算符:
    在这里插入图片描述
     
    不可重载运算符:
    在这里插入图片描述
     

    重载函数调用()

    • 类内部重载函数调用(), 使得对象可调用,类似python中重写__call__魔法方法;
    #include 
    #include 
    using namespace std;
    
    
    class People {
    public:
    	int age; // 实例 成员变量
    	string name;
    
    	People() {
    		cout << "走无参构造函数..." << endl;
    		this->age = 30;
    	}
    	People(const string& name, const int& age) {
    		cout << "走有参构造函数..." << endl;
    		this->name = name;
    		this->age = age;
    	}
    
    	virtual ~People() {
    		cout << "删除对象" << endl;
    	}
    
    	// 重载 函数调用()运算符
    	void operator()(int age) {
    		cout << "param age:" << age << endl;
    		cout << "成员age:" <<  this->age << endl;
    	}
    	
    };
    
    
    int main() {
    	People(); // 实例化,走无参构造
    
    	string name = "jack";
    	People("jack", 20); // 实例化,走有参构造
    
    	// 声明式 对象  自动释放内存
    	People p = People("tom", 18); // 同 python 类的实例化,这里还会执行拷贝构造函数
    	
    	// 对象可调用
    	p(30);
    	
    	return 0;
    }
    

     

    其他重载运算符参考

  • 相关阅读:
    qt模块依赖
    js 逆向之 node.js 环境配置详细教程
    softmax的高效CUDA编程和oneflow实现初步解析
    BUUCTF reverse wp 81 - 85
    图搜索算法详解
    《自然语言处理实战:利用Python理解、分析和生成文本》读书笔记:第4章 词频背后的语义
    域名暂停解析是怎么回事?如何恢复解析?
    微擎模块 有间解忧杂货店小程序2.14 修复用户头像昵称不显示的BUG
    元宇宙001 | 情绪无法自控?元宇宙助你一臂之力
    (c语言进阶)数据存储——浮点型存储
  • 原文地址:https://blog.csdn.net/weixin_45228198/article/details/140025793