1. 程式人生 > 其它 >c++ --物件模型和this指標

c++ --物件模型和this指標

物件模型和this指標

1.成員變數和成員函式分開儲存

class person {

public:
	person() {
		//m_a = 10;
	}
	//int m_a;//非靜態成員變數佔物件空間
	//static int m_b;//靜態成員變數不佔物件空間
	//void fun1() {}//函式不佔物件空間
	//static void fun2(){}//靜態成員函式不佔物件空間
};
void test01() {
	person p;
	cout << "sizeof(p)=" << sizeof(p) << endl;
    //當物件屬性為空時,sizeof(p)=1,其他情況為4;
}

2.this指標

成員物件和成員函式分開儲存,為了區分成員函式被哪個物件呼叫,需要通過this指標解決

this指標指向被呼叫的成員函式所屬的物件

class person {
public:
	person(int age) {
        //this指標解決名稱衝突(也可以將age命名為m_age)
		this->age = age;
	}
	person & addpersonage(person &p) {
        //去掉引用換成值返回 會呼叫拷貝建構函式 複製一個新的資料
		age += p.age;
		//返回物件本身
		return *this;
	}
	int age;

};
void test01() {
	person p(18);
	cout << "年齡是" << p.age << endl;
}
void test02() {
	person p(10);
	person p1(10);
	p.addpersonage(p1).addpersonage(p1);
	cout << p.age << endl;
}

3.空指標

//空指標也可以呼叫成員函式
class person {

public:
	void fun1() {
		cout << "fun1呼叫" << endl;
	}
	void fun2() {
		cout << "年齡是" << this->m_age << endl;
	}
	int m_age = 10;
};
int main() {
	person *p=NULL;
	//沒有用到this指標,所以可以呼叫成員函式
    p->fun1();
	//p->fun2();錯誤,其中用到了this指標
	system("pause");
	return 0;
}

4.常物件和常函式

class person {
public:
	//常函式
	void fun() const 
	{
		//m_age = 10;
		m_b = 10;
		cout << m_b << endl;

	}
	int m_age;
	mutable int m_b;//加上mutable可訪問
};
int main() {
	const person p;//常量物件
	//p.m_age = 10;
	//常物件訪問常函式
	p.fun();
	system("pause");
	return 0;
}