静态成员
在成员变量和成员函数前加上关键字static,称为静态成员
静态成员变量
(1)所有对象共享同一份数据
(2)在编译阶段就分配内存
(3)类内声明,类外实现
#include<iostream>
using namespace std;
class Person
{
public:
static int m_A; //static修饰之后的静态成员变量
};
int Person :: m_A = 100; // 类外实现
void test()
{
Person p1;
cout << p1.m_A << endl;
Persom p2;
p2.m_A = 200;
cout << p1.m_A << endl; // 此时的m_A 此时已经被改为两百 ,所有对象共享同一份数据
}
int main()
{
system("pause");
return 0;
}
静态成员变量和静态成员函数 也是有访问权限的,在private权限下 类外不能访问 静态成员变量和静态成员函数
静态成员函数
(1)所有对象共享同一个函数
(2)静态成员函数只能调用静态成员变量
C++对象模型和this指针
在C++中,类内的成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象上。
空对象在C++中占一个字节,编译器自动分配的,为了区分每个空对象的内存地址,
每个空对象都应该有独一无二的内存地址
this指针
C++中this指针指向的是调用成员函数所属的对象;不需要定义直接使用
this指针的用途:在形参和成员变量名相同情况下,用this指针来区分;在类的非静态成员函数中返回对象本身用 return *this;
class Person
{
public:
Person (int age)
{
this->age = age; //this指针区分成员变量和形参
}
Person & Personadd(Person &p)
{
this->age += p.age;
return *this; //在类的非静态成员函数中 this指针返回对象本身
}
int age;
};
void test()
{
Person p1(10);
Person p2(20);
p2.Personadd(p1);
}
空指针也可以调用成员函数,但是要注意有没有用到this指针,需要加以判断保证代码的健壮性
class Person
{
public:
void showp()
{
cout << "hello world" << endl;
}
void showw()
{
cout << m_A << endl; //相当于 this->m_A; 但this指针指向的对象为空 所有程序会出错
}
int m_A;
};
void test()
{
Person *p = NULL;
p->showp();
p->showw(); //会出错,因为this指针为空指向
}
const修饰成员函数
常函数:成员函数后加const后我们称这个函数为常函数,常函数不能修改成员属性,成员属性在声明前加mutable后,在常函数中仍让可以修改。
常对象:在对象声明前加 const修饰; 常对象只能调用常函数
常对象不可以修改普通成员变量 可以修改加mutable声明的成员变量
友元
友元的目的:让一个函数或一个类访问另一个类的私有成员
(1)全局函数做友元
(2)友元类
(3)成员函数做友元
class Person
{
friend void test(Person &p);
private:
int m_A;
int m_B;
};
void test(Person &p)
{
cout << p.m_A << endl;
cout << p.m_B << endl;
}
friend 关键字
C++ 运算符重载
operator + 、 operator << 、operator++ 、operator= 、 operator < 、operator ()