C++类的对象
对象new不出来 人气:0类对象作为成员
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(); }
从结果图中看出同时调用有参构造的时候,先调用对象成员的构造,再调用本类构造
析构的顺序相反
静态成员
定义和分类
静态成员就是在成员变量和成员函数前加上关键字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指针和成员变量以及成员函数的存储问题,期待你的鼓励,下篇再见!
加载全部内容