目录
  • 类对象作为成员
  • 静态成员
    • 定义和分类
    • 静态成员变量
    • 静态成员函数
  • 总结

    类对象作为成员

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

    例如:

    class Phone {}
    class Person
    {
        Phone p;
    }

    tips:当类中成员是其他类对象时,我们称该成员为 对象成员

    Person类中有对象p作为成员,Phone为对象成员,那么当创建Person对象时,Phone与Person的构造和析构的顺序是谁先谁后?

    那让我们在两个类中加上一些输出语句做提示就好了,可以清晰的看到构造和析构的顺序。

    示例:

    #include<iostream>
    using namespace std;
    //类对象作为类成员
    class Phone
    {
    public:
    	Phone(string P_name)
    	{
    		p_name = P_name;
            cout<<"Phone类有参构造"<<endl;
    	}
        ~Phone()
    	{
    		cout << "Phone析构" << endl;
    	}
    	string p_name;
    };
    class Person
    {
    public:
    	Person(string m_Name,string p_Name):m_name(m_Name),m_PName(p_Name) {
            cout << "Person构造" << endl;}//初始化列表
        ~Person()
    	{
    		cout << "Person析构" << endl;
    	}
    	string m_name;
    	Phone m_PName;
    };
    void test01()
    {
    	Person p1("张三", "华为nova7");
    	Person p3(p1);//调用默认拷贝构造函数
    	p3.m_name = "李白"; p3.m_PName.p_name = "iphone MAX";
    	cout << p1.m_name << "拿着" << p1.m_PName.p_name << endl;
    	cout << p3.m_name << "拿着" << p3.m_PName.p_name << endl;
    }
    int main()
    {
    	test01();
    }

    C++分析类的对象作类成员调用构造与析构函数及静态成员

    从结果图中看出同时调用有参构造的时候,先调用对象成员的构造,再调用本类构造

    析构的顺序相反

    静态成员

    定义和分类

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

    静态成员分为:

    静态成员变量

    • 所有对象共享同一份数据
    • 在编译阶段分配内存
    • 类内声明,类外初始化

    静态成员函数

    • 所有对象共享同一个函数
    • 静态成员函数只能访问静态成员变量

    静态成员变量

    class Person
    {
    public:
    	static int m_A; 
    private:
    	static int m_B; 
    };
    int Person::m_A = 10;
    int Person::m_B = 10;
    void test01()
    {
    	//静态成员变量两种访问方式
    	//1、通过对象
    	Person p1;
    	p1.m_A = 100;
    	cout << "p1.m_A = " << p1.m_A << endl;
    	Person p2;
    	p2.m_A = 200;
    	cout << "p1.m_A = " << p1.m_A << endl; //共享同一份数据
    	cout << "p2.m_A = " << p2.m_A << endl;
    	//2、通过类名
    	cout << "m_A = " << Person::m_A << endl;
    	//cout << "m_B = " << Person::m_B << endl; //私有权限访问不到
    }
    int main() {
    	test01();
    	system("pause");
    	return 0;
    }

    静态成员变量也是有访问权限的,无论是public或者是private在类内都可以被访问,m_A和m_B在类内定义在类外初始化,还记得类外初始化吗,就是变量类型加类名加::变量名=值;同时可以通过对象和类名两种方式访问静态成员变量。

    静态成员函数

    class Person
    {
    public:
    	int getB()
    	{
    		return m_B;
    	}
    	static int m_A;
    	int m_C;//非静态成员变量
    	//静态成员函数
    	static void func()
    	{
    		m_A = 100;
    		//m_C = 20;
    		cout << "static void func 的调用" << endl;
    	}
    private:
    	static int m_B;
    	static void func2()
    	{
    		cout << "static void func 的调用" << endl;
    	}
    };
    int Person::m_A = 100;//类外外面初始化
    int Person::m_B = 200;
    void test03()
    {
    	//调用方式有两种
    	//1、通过对象调用
    	Person p;
    	p.func();
    	//通过类名调用
    	Person::func();
    	//类外访问不到静态成员函数,静态成员函数也有访问权限
    }

    静态成员函数也有权限的控制,代码里写了func是公共权限,func2是私有权限;静态成员函数也有对象调用和类名调用两种方式,但是都无法调用私有权限的静态成员函数。

    注意事项:静态成员函数不可以访问非静态成员变量,无法区分到底是哪个对象的属性,只有公用的静态成员变量才可以被访问。

    总结

    热烈庆祝对象的初始化和清理完工,作为C++核心编程比较重要的一部分,我也是认真的总结了一遍,感觉很充实,下篇博客直指this指针和成员变量以及成员函数的存储问题,期待你的鼓励,下篇再见!

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。