1.成员变量和成员函数分开存储
虽然类里的成员被封装在一起,但是他们并不是存储在一起,成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象上。静态成员变量,静态成员函数,非静态成员函数都不在类的对象上。
c++编译器为了区分每个空对象占内存的位置,会给每个空对象也分配一个字节的空间
空对象占用内存空间
每个空对象也应该有独一无二的内存地址
#include<iostream>
#include<string>
using namespace std;
class person
{
public:
int m_b; //非静态成员变量,属于类的对象上
static int m_a; //静态成员变量,不属于类对象上
void func()//非静态成员函数 ,不属于类对象上
{
}
static void func2()//静态成员函数,不属于类对象上
{
}
};
int person :: m_a = 10;//静态成员变量,类内声明类外初始化
void test01()
{
person p;
person p2;
//c++编译器为了区分每个空对象占内存的位置,会给每个空对象也分配一个字节的空间
//空对象占用内存空间
//每个空对象也应该有独一无二的内存地址
cout << "sizeof p = " << sizeof(p) << endl;
}
int main()
{
test01();
//test02();
}
2.this指针概念
c++中成员变量和成员函数是分开存储的,每一个非静态成员函数只会诞生一份函数实例,也就是多个同类型的对象会共用一块代码。那么问题是,这一块代码是如何区分哪个对象调用的自己呢?
c++提供了this指针来解决这个问题。this指针指向被调用的成员函数所属的对象。
#include<iostream>
#include<string>
using namespace std;
//1.解决形参和成员变量名称冲突
//2.返回对象本身用*this
class person
{
public:
person(int age)
{
this->age = age;//this指针指向被调用的成员函数所属的对象
}
person& personaddage(person &p)//返回本体用引用的方式返回
{//如果返回值是person(值)则会一直创建新的对象返回。
this->age += p.age ;
return *this;//返回对象本体
}
int age;
};
void test02()
{
person p1(10);
person p2(10);
//链式编程思想
p2.personaddage(p1).personaddage(p1).personaddage(p1);
cout <<"p2的年龄为" << p2.age << endl;
}
int main()
{
test02();
}
3.空指针访问成员函数
c++中空指针也是可以调用函数的,但是也要注意有没有用到this指针
如果用到this指针,需要加以判断保证代码的健壮性。
#include<iostream>
#include<string>
using namespace std;
//空指针调用成员函数
class person{
public:
void showclassname()
{
cout <<" this is person class" << endl;
}
void showpersonage()
{
if(this == null)
{
return ;
}
//报错原因是因为传入的指针是为null,没有创建实体
cout <<"age: " << this->m_age << endl;
}
int m_age;
};
void test01()
{
person *p = NULL;
p->showclassname();
p->showpersonage();
}
int main()
{
test01();
return 0;
}
4.const修饰成员函数
常函数:
成员函数后加const
void showperson() const
常函数内不可以修改成员属性
成员属性声明时加关键字mutable后,在常函数中依然可以修改
常对象:
声明对象前加const
常对象只能调用常函数