成员对象和成员函数是分开储存的

只有非静态的成员变量储存在了类上,是实际的占空间的。

  1. class Person
  2. {
  3. public:
  4. int m_a; //非静态成员变量,属于类的对象上
  5. static int m_b; //静态成员变量,不输于类的对象上
  6. void fun() {}; //非静态成员函数,不属于
  7. static void fun2() {};//静态成员函数,不属于
  8. };
  1. class Person {
  2. public:
  3. Person() {
  4. mA = 0;
  5. }
  6. //非静态成员变量占对象空间
  7. int mA;
  8. //静态成员变量不占对象空间
  9. static int mB;
  10. //函数也不占对象空间,所有函数共享一个函数实例
  11. void func() {
  12. cout << "mA:" << this->mA << endl;
  13. }
  14. //静态成员函数也不占对象空间
  15. static void sfunc() {
  16. }
  17. };
  18. int main() {
  19. cout << sizeof(Person) << endl;
  20. system("pause");
  21. return 0;
  22. }

this 指针

this指针有两点用途

  1. 解决名称冲突
  2. 返回对象本身用*this

解决形参的名称冲突,见以下实例:

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. class Person
  5. {
  6. public:
  7. Person(int age) {
  8. this->age = age;
  9. }
  10. int age;
  11. };
  12. void main() {
  13. Person p(18);
  14. cout << p.age;
  15. }

当传入的形参变量名和成员变量名相同时,使用this,因为this指向了这个类的对象。
所以使用类似于链表中的指针来访问成员。

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. class Person
  5. {
  6. public:
  7. Person(int age) {
  8. this->age = age;
  9. }
  10. //返回值类型是引用,引用只是原对象的一个别名,如果不是引用,则返回一个新的类
  11. Person& AddAge(Person &p) {
  12. this->age += p.age;
  13. return *this;//this指向Person,*this就是person,返回值类型也是Person,但是需要引用
  14. }
  15. int age;
  16. };
  17. void main() {
  18. Person p(18);
  19. Person p2(10);
  20. p.AddAge(p2).AddAge(p2).AddAge(p2);
  21. cout << p.age;
  22. system("pause");
  23. }

c++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象
this指针是隐含每一个非静态成员函数内的一种指针
this指针不需要定义,直接使用即可
this指针的用途:

  • 当形参和成员变量同名时,可用this指针来区分
  • 在类的非静态成员函数中返回对象本身,可使用return *this
    1. class Person
    2. {
    3. public:
    4. Person(int age)
    5. {
    6. //1、当形参和成员变量同名时,可用this指针来区分
    7. this->age = age;
    8. }
    9. Person& PersonAddPerson(Person p)
    10. {
    11. this->age += p.age;
    12. //返回对象本身
    13. return *this;
    14. }
    15. int age;
    16. };
    17. void test01()
    18. {
    19. Person p1(10);
    20. cout << "p1.age = " << p1.age << endl;
    21. Person p2(10);
    22. p2.PersonAddPerson(p1).PersonAddPerson(p1).PersonAddPerson(p1);
    23. cout << "p2.age = " << p2.age << endl;
    24. }
    25. int main() {
    26. test01();
    27. system("pause");
    28. return 0;
    29. }