• 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;
    }
    

     

    其他重载运算符参考

  • 相关阅读:
    大学生HTML作业节日网页 HTML作业节日文化网页期末作业 html+css+js节日网页 HTML学生节日介绍 HTML学生作业网页视频
    二十二、MySQL联合查询
    力扣--深度优先算法/回溯算法40.组合总和 Ⅱ
    MySQL系列1:MySQL体系架构
    springMvc27-get乱码解决
    精品基于Java的社区团购系统SSM
    Spring refresh 方法之invokeBeanFactoryPostProcessors 方法解析
    Java项目实战记录:雷达数据插值
    外贸新手如何利用领英寻找你的潜在客户(建议收藏)
    uniapp 配置并使用 VueX
  • 原文地址:https://blog.csdn.net/weixin_45228198/article/details/140025793