类和对象_对象的初始化和清理(下)

类与对象作为类成员

C++类中的成员可以是另一个类的对象,我们称该成员为 对象成员

class A{}
class B {
    A a;
}

B类中对象A作为成员,A为对象成员

那么当创建B对象时,A与B的构造和析构的顺序?

在之前的类里,先构造的后析构,后构造的先析构

#include <iostream>
#include <string>
using namespace std;

class Phone {
    public:
        Phone(string pName) {
             m_PName = pName;
        }
        
        string m_PName;
};

class Person {
    public:
        //Phone m_Phone = pName  隐式转换 
        Person(string name, string pName) :m_Name(name), m_Phone(pName){
            
        }
        
        string m_Name;
        Phone m_Phone;
};

int main() {
    Person p("张三","苹果");
    
    cout << p.m_Name << " " <<p.m_Phone.m_PName ;
}

 

当其他类对象作为本类成员,构造时候先构造类对象,再构造自身;析构的顺序:先构造的后析构  

静态成员

静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员

静态成员分为:

  • 静态成员变量
    • 所有对象共享同一份数据
    • 在编译阶段分配内存
    • 类内声明,类外初始化
  • 静态成员函数
    • 所有对象共享同一个函数
    • 静态成员函数只能访问静态成员变量

静态成员变量

#include <iostream>
#include <string>
using namespace std;

class Person {
    public:
        //所有对象都共享一分数据 
        //编一阶段就分配内存 
        //类内声明 类外初始化操作 
        static int m_A;
        
        //静态成员变量也是有访问权限的
    private:
        static int m_B; 
};

int Person::m_A = 100;
int Person::m_B = 10;

int main() {
    Person p1;
    cout << p1.m_A << endl;; //100
    
    Person p2;
    p2.m_A = 200;
    cout << p1.m_A << endl; //200
    //静态成员变量 不属于某个对象上,所有对象都共享同一份数据
    //访问方式有两种
    //1、 通过对象访问(如上) 
    //2、 通过类名访问
    cout << Person::m_A << endl; //200 
    
    //cout << Person::m_B << endl; //无法访问 
}

静态成员函数

 

#include <iostream>
#include <string>
using namespace std;

class Person {
    public:    
        //静态成员函数 
        static void func() {
            m_A = 100; //静态成员函数可以访问 静态成员变量 
            //m_B = 200;  //静态成员函数 不可以访问 非静态成员变量,无法区分到底是哪个对象的 
            cout << "static void func调用"  << endl; 
        }
        
        static int m_A; //静态成员变量 
        int m_B;        //非静态成员变量 
        
        //静态成员函数也有访问权限 
};

int Person::m_A = 0;

int main() { 
//    Person p;
//    p.func(); //通过对象访问
    Person::func(); //通过类名访问 (不需要创建对象) 
}

 

上一篇:ElasticSearch学习路线(Python)


下一篇:javaSE21/9/22