成员变量和成员函数分开存储
在C++中,类内的成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象,其余都存储在类中
当创建一个类的对象时,会为对象分配一块内存空间,用于存储成员变量。每个对象都有自己的成员变量副本,这些变量存储在对象的内存空间中,并且在对象的声明周期中保持存在(这里的成员变量为非静态成员变量)。
成员函数是类的一部分,它们并不存储在对象的内存空间中,而是存储在类的代码段中
类的代码段是指类的定义和成员函数的代码部分,它定义了类的结构,成员变量和成员函数的声明和实现,类的代码段是静态的,在编译时被编译器处理,并在程序执行时被装载到内存中,它是共享的,意味着所有该类的的对象都使用相同的代码。
空对象占用内存空间为1个字节,因为C++编译器会给每个空对象也分配一个字节空间,为了区分空对象内存的位置。
class Person{
}
class Person1{
public:
int a; //非静态成员变量属于类的对象
static int b; //静态成员函数属于类,可以直接通过类名进行访问
void func(){} //非静态成员函数属于类
static void func1(){} //静态成员函数属于类,也可以直接通过类名进行访问
}
int main(){
Person p;
cout << sizeof(p) << endl; // 1
Person1 p1;
cout << sizeof(p1) << endl; //4
}
this指针
this是C++特殊的对象指针,this指针指向正在调用成员函数的对象
this指针是一个隐式参数,不需要定义,直接使用即可
#include <iostream>
class MyClass {
public:
void printAddress() {
std::cout << "当前对象的地址为: " << this << std::endl;
}
void printValue() {
std::cout << "当前对象的值为: " << value << std::endl;
}
private:
int value;
};
int main() {
MyClass obj1;
obj1.printAddress(); // 输出当前对象的地址
obj1.printValue(); // 输出当前对象的值
MyClass obj2;
obj2.printAddress(); // 输出当前对象的地址
obj2.printValue(); // 输出当前对象的值
return 0;
}
this指针的用途
-
当形参和成员变量同名时,可以用this指针来区分
class Person{
private:
int age;
public:
Person(int age){
this->age = age; //若不用this则没有对成员变量进行成功初始化
}
};
-
在类的非静态成员函数中返回对象本身,可以使用return *this,实现链式调用
class MyClass{
public:
int count;
MyClass& addCount(){ //此处要是使用MyClass作为返回值的话,那么下面打印就是1,
//因为值返回相当于重复调用拷贝构造函数
this->count += 1;
return *this;
}
};
int main(){
MyClass obj;
obj.addCount().addCount().addCount();
cout << obj.count << endl; //3
}