成员对象和成员函数是分开储存的
只有非静态的成员变量储存在了类上,是实际的占空间的。
class Person
{
public:
int m_a; //非静态成员变量,属于类的对象上
static int m_b; //静态成员变量,不输于类的对象上
void fun() {}; //非静态成员函数,不属于
static void fun2() {};//静态成员函数,不属于
};
class Person {
public:
Person() {
mA = 0;
}
//非静态成员变量占对象空间
int mA;
//静态成员变量不占对象空间
static int mB;
//函数也不占对象空间,所有函数共享一个函数实例
void func() {
cout << "mA:" << this->mA << endl;
}
//静态成员函数也不占对象空间
static void sfunc() {
}
};
int main() {
cout << sizeof(Person) << endl;
system("pause");
return 0;
}
this 指针
this指针有两点用途
- 解决名称冲突
- 返回对象本身用*this
解决形参的名称冲突,见以下实例:
#include <iostream>
#include <string>
using namespace std;
class Person
{
public:
Person(int age) {
this->age = age;
}
int age;
};
void main() {
Person p(18);
cout << p.age;
}
当传入的形参变量名和成员变量名相同时,使用this,因为this指向了这个类的对象。
所以使用类似于链表中的指针来访问成员。
#include <iostream>
#include <string>
using namespace std;
class Person
{
public:
Person(int age) {
this->age = age;
}
//返回值类型是引用,引用只是原对象的一个别名,如果不是引用,则返回一个新的类
Person& AddAge(Person &p) {
this->age += p.age;
return *this;//this指向Person,*this就是person,返回值类型也是Person,但是需要引用
}
int age;
};
void main() {
Person p(18);
Person p2(10);
p.AddAge(p2).AddAge(p2).AddAge(p2);
cout << p.age;
system("pause");
}
c++通过提供特殊的对象指针,this指针,解决上述问题。this指针指向被调用的成员函数所属的对象
this指针是隐含每一个非静态成员函数内的一种指针
this指针不需要定义,直接使用即可
this指针的用途:
- 当形参和成员变量同名时,可用this指针来区分
- 在类的非静态成员函数中返回对象本身,可使用return *this
class Person
{
public:
Person(int age)
{
//1、当形参和成员变量同名时,可用this指针来区分
this->age = age;
}
Person& PersonAddPerson(Person p)
{
this->age += p.age;
//返回对象本身
return *this;
}
int age;
};
void test01()
{
Person p1(10);
cout << "p1.age = " << p1.age << endl;
Person p2(10);
p2.PersonAddPerson(p1).PersonAddPerson(p1).PersonAddPerson(p1);
cout << "p2.age = " << p2.age << endl;
}
int main() {
test01();
system("pause");
return 0;
}