C++对象模型和this指针
成员变量和成员函数分开存储
1 只有非静态成员变量才属于类的对象上 空对象占用字节为1
class Person
{
};
void test01()
{
Person p;
cout << "size of = " << sizeof(p) << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
占用内存空间为 1 的原因是:如果有其他的空对象,各自分配一个内存空间可以让两者之间相互区别,而且 1 字节也很省内存。 所以每个空对象都会有一个自己的内存地址。
2
class Person
{
int m_A;
};
void test02()
{
Person p;
cout << "size of = " << sizeof(p) << endl;
}
int main()
{
test02();
system("pause");
return 0;
}
因为 int 类型 ,不把之前的空类型考虑进去。
将Person类改为
class Person
{
int m_A;
static int m_B;
};
int Person::m_B = 0;
非静态成员变量 属于类的对象上 静态成员变量,不属于类对象上
所以不考虑在内
class Person
{
int m_A;
static int m_B;
void func()
{
}
};
int Person::m_B = 0;
所以成员变量和成员函数是分开存储的,非静态成员函数不属于类对象上
static voidfunc() {} 静态成员函数也不会增加 不属于类对象上
this指针
用于区分类中多个对象调用函数时,分别都是哪个函数在调用自己。
this 指针指向被调用成员函数所属的对象
特点: 1 this指针是隐含每一个非静态成员函数内的一种指针 2 this 指针不需要定义,直接使用即可。
用途: 1 当形参和成员变量同名时,可用this指针来区分 2 在类的非静态成员变量中返回对象本身,可使用return *this
class Person
{
public:
Person(int age)
{
this->age = age;
}
int age;
};
void test01()
{
Person p1(18);
cout << "p1的年龄为: " << p1.age << endl;
}
main()
{
test01();
system("pause");
return 0;
}
如果不加 this 都会默认为形参 age ,从而报错。 this 指向被调用的对象,此时为 p1。
2
class Person
{
public:
Person(int age)
{
this->age = age;
}
void PersonAddAge(Person &p)
{
this->age += p.age;
}
int age;
};
void test01()
{
Person p1(18);
cout << "p1的年龄为: " << p1.age << endl;
}
void test02()
{
Person p1(10);
Person p2(10);
p2.PersonAddAge(p1);
cout << "p2年龄:" << p2.age << endl;
}
int main()
{
test01();
test02();
system("pause");
return 0;
}
此时p2为 20 ,若要多次相加需要改动为
class Person
{
public:
Person(int age)
{
this->age = age;
}
Person& PersonAddAge(Person &p)
{
this->age += p.age;
return* this;
}
int age;
};
void test01()
{
Person p1(18);
cout << "p1的年龄为: " << p1.age << endl;
}
void test02()
{
Person p1(10);
Person p2(10);
p2.PersonAddAge(p1).PersonAddAge(p1).PersonAddAge(p1);
cout << "p2年龄:" << p2.age << endl;
}
int main()
{
test01();
test02();
system("pause");
return 0;
}
链式编程思想:可以往后无限的追加。
但如果函数,不使用引用方法,返回的是一个值,就会创建新的对象
Person PersonAddAge(Person &p)
{
this->age += p.age;
return* this;
}
int age;
};
在第一次调用Person PersonAddAge()后 ,p2加了10, 但在这之后返回的并不是本体了,而是根据本体创建的一个新的数据。Person 和 *this 是不一样的数据(见拷贝构造函数的调用时机-以值方式返回局部对象)。 所以每一次Person PersonAddAge()后,都是一个新的对象,所以最后输出结果p2 是不变的20。 疑问:至于为什么不是p2 为 10 。 以值方式返回局部对象会调用拷贝构造函数。对p2进行一次PersonAddAge操作后,将p2的结果拷贝为p2’ 。所以p2还是经过了一次加年龄的操作的 。对p2进行一次PersonAddAge操作后,将p2的结果拷贝为p2’
|