对象成员
C++类中的成员可以是另一个类的对象,我们称该成员为对象成员
下述代码段中,就存在对应关系:
class Phone
{
public:
Phone(string pName)
{
m_Pname = pName;
}
//手机品牌名称
string m_Pname;
};
class Person
{
public:
Person(string name, string pName):m_name(name), m_Phone(pName)//初始化对象
{
}
//这里初始化的过程,其中m_name就是直接在类里面进行赋值操作;而m_Phone进行赋值的时候,
//就相当于给Phone m_Phone赋值(即对对象赋初值),相当于 Phone m_Phone = pName:隐式转换法,来对对象进行初始化操作
//姓名
string m_name;
//手机
Phone m_Phone;//Phone是对象成员
//总结:在使用对象成员时,构造时,先构造其他类的对象,再构造自身;(每个部分都定义好了,才能够组成整体)
//在析构时,先析构对象成员的内存;再析构该对象的内存(析构顺序与构造顺序相反)
};
void test01()
{
Person p("张三","苹果MAX");
cout << p.m_name << "拿着" << p.m_Phone.m_Pname << endl;
}
int main()
{
test01();
system("pause");
}
其中,要注意初始化成员对象的语法,即person的初始化。对于m_Phone这一对象的初始化,采用的是括号初始化的方法;也可以写作:Phone m_Phone = pName;这样就对其中的属性进行完全初始化。
在成员B作为另一个成员A的成员时,构造的先后顺序为:先构造B,再构造A(先局部,后整体);而析构的顺序为:先整体,后局部。
静态成员 与 静态函数
静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员
static
静态成员分为:
1.静态成员变量
所有成员共享同一份数据
在编译阶段分配内存;类内声明,类外初始化
2.静态成员函数
所有对象共享同一个函数
静态成员函数只能访问静态成员变量
关于静态成员与静态函数的案例:
静态成员变量:
所有成员共享同一份数据
在编译阶段分配内存;类内声明,类外初始化
1. 静态成员变量
静态成员作为公共类型参数,可以被调用,也可以进行修改;但是需要进行声明与初始化。
(类内声明,类外初始化!)
声明的语法:静态成员变量类型 Person: : 静态成员变量名
下述代码段创建了两个成员,两个成员都可以对静态成员进行访问与修改;而访问方法为两类:
利用对象的名称访问、利用类名进行访问。类名访问: 类名 ::静态成员名称
class Person
{
public:
//所有对象都共享同一份数据
//在编译阶段分配内存
//类内声明,类外初始化
static int m_A;
//当然,静态成员也是有访问权限的
private:
static int m_B;
};
//这个就是进行类外初始化的过程!
//这个就是进行类外初始化的过程!
//Person::是用来说明该变量的作用域的
int Person:: m_A = 100;
int Person::m_B = 200;
void test01()
{
Person p;
cout << p.m_A << endl;//这里无法直接进行打印输出,因为没有完成:类内声明,类外初始化
Person p2;
p.m_A = 12220;
cout << p.m_A << endl;//这里对p.m_A作出修改,那么打印出来的结果是多少?
//运行结果应该是修改过后的值了,说明这个数据对于不同类来说,是共享的。
}
void test02()
{
//静态成员变量,不属于某个对象,因为所有对象都共享同一份数据
//所以静态成员变量有两种访问方式: 通过对象进行访问, 通过类名进行访问
Person p;
cout << p.m_A << endl;//通过对象进行访问
cout << Person::m_A << endl;//通过类名进行访问
//cout << Person::m_B << endl;//这里进行报错,是无法访问的!(因为private为私有权限,
//需要在public中创建渠道来对其进行访问)
}
int main()
{
test01();
system("pause");
}
2.静态成员函数
静态成员函数:
所有对象共享同一个函数
静态成员函数只能访问静态成员变量
下述代码段中,书写了静态成员函数;可以看到在对象中的普通变量m_B是无法通过静态成员函数进行访问的。
class Person
{
public:
static void func()
{
m_A = 100;//静态成员函数可以访问静态成员函数;
/*m_B = 200;*///这里直接报错,因为静态成员函数无法访问除去静态成员变量以外的变量。
//原因就是,静态成员变量是共享的,修改后不会对其造成影响;但是对于非静态成员变量,无法确定是那个对象里的变量!!
cout << "static void func 的调用 " << endl;
}
static int m_A;//静态成员变量
int m_B;
private:
//静态成员函数也是有访问权限的!
//除非在public中,为其访问建立链接,否则是无法进行访问的!
static void func2()
{
}
};
int Person::m_A = 0;
void test01()
{
//如何访问静态成员函数呢?(同样的,静态成员函数不属于某一个特定的对象,直接用类名就可以访问)
//有两种访问静态成员函数的方式:
//1. 通过对象访问
Person p;
p.func();
//2. 通过类名访问
Person::func();
}
int main()
{
test01();
system("pause");
}
总结:
静态成员就是在成员变量和成员函数前加上关键字static,称为静态成员
静态成员分为:
1.静态成员变量
所有成员共享同一份数据
在编译阶段分配内存
类内声明,类外初始化
2.静态成员函数
所有对象共享同一个函数
静态成员函数只能访问静态成员变量
无论是静态成员变量,还是静态成员函数,都是可以放到private里的,这样就无法进行直接访问。 即静态成员变量与静态成员函数都具有访问权限!
并且,在使用静态成员变量之前需要声明且初始化!
初始化语法:静态成员变量 类名 ::静态成员变量名称。