1. C++对象模型
C++中类对象的成员变量和成员函数是分开存储的
- 非静态成员变量,属于类的对象上
- 静态成员变量,不属于类的对象上
- 非静态成员函数,不属于类的对象上
- 静态成员函数,不属于类的对象上
即只有非静态成员变量才属于类的对象上
示例1:(空类的对象模型)
class Person
{
};
void test()
{
Person p;
cout << "size of p = " << sizeof(p) << endl;
}
示例2:(只含int类型静态成员变量)
class Person
{
int m_A;
};
void test()
{
Person p;
cout << "size of p = " << sizeof(p) << endl;
}
示例3:(含int类型静态成员变量和int类型非静态成员变量)
class Person
{
int m_A;
static int m_B;
};
int Person::m_B = 0;
void test()
{
Person p;
cout << "size of p = " << sizeof(p) << endl;
}
示例4:(含int类型静态成与非静态成员变量,同时含有静态与非静态成员函数)
class Person
{
public:
int m_A;
static int m_B;
void func()
{
}
static void func2()
{
}
};
int Person::m_B = 0;
void test()
{
Person p;
cout << "size of p = " << sizeof(p) << endl;
}
2. this指针
通过C++对象模型可知,静态与非静态成员函数都不属于类的对象,即每一个成员函数只会生成一份函数实例,类的不同对象共享这一份函数实例。 那么就面临着一个问题:既然类的所有对象都共享同一份函数实例,那代码如何区分是哪个对象在调用成员函数呢? 这就引出了this指针的概念,C++通过提供特殊的对象指针,即this指针,解决上述问题。this指针指向被调用成员函数所属的对象
this指针的两大用途:
- 当形参和成员变量同名时,可用this指针区分,以解决名称冲突
示例:
class Person
{
public:
Person(int age)
{
this->age = age;
}
int age;
};
int main()
{
Person p1(10);
system("pause");
return 0;
}
- 在类的非静态成员函数中返回对象本身,可使用return *this
示例1:
class Person
{
public:
Person(int age)
{
this->age = age;
}
void AddPerson(Person &p)
{
this->age += p.age;
}
int age;
};
int main()
{
Person p1(10);
Person p2(10);
p2.AddPerson(p1);
system("pause");
return 0;
}
示例2:(解决示例1无法连续调用AddPerson的问题)
class Person
{
public:
Person(int age)
{
this->age = age;
}
Person& AddPerson(Person &p)
{
this->age += p.age;
return *this;
}
int age;
};
int main()
{
Person p1(10);
Person p2(10);
p2.AddPerson(p1).AddPerson(p1);
cout << "p2的年龄是" << p2.age << endl;
system("pause");
return 0;
}
注意事项:由this指针衍生出的一个问题是空指针访问成员函数的问题 空指针是可以访问成员函数的,但是如果成员函数出现访问类属性的情况,就会出现报错。 示例:
class Person
{
public:
Person(int age)
{
this->age = age;
}
void showClassName()
{
cout << "this is Person class" << endl;
}
void showPersonAge()
{
cout << "age = " << age << endl;
}
int age;
};
int main()
{
Person * p = NULL;
p->showClassName();
p->showPersonAge();
system("pause");
return 0;
|