欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

三、C++面向?qū)ο?類和對象那些你不知道的細(xì)節(jié)原理

一、類和對象、this指針

OOP語言的四大特征是什么?

創(chuàng)新互聯(lián)不只是一家網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司;我們對營銷、技術(shù)、服務(wù)都有自己獨特見解,公司采取“創(chuàng)意+綜合+營銷”一體化的方式為您提供更專業(yè)的服務(wù)!我們經(jīng)歷的每一步也許不一定是最完美的,但每一步都有值得深思的意義。我們珍視每一份信任,關(guān)注我們的成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)質(zhì)量和服務(wù)品質(zhì),在得到用戶滿意的同時,也能得到同行業(yè)的專業(yè)認(rèn)可,能夠為行業(yè)創(chuàng)新發(fā)展助力。未來將繼續(xù)專注于技術(shù)創(chuàng)新,服務(wù)升級,滿足企業(yè)一站式營銷型網(wǎng)站建設(shè)需求,讓再小的品牌網(wǎng)站設(shè)計也能產(chǎn)生價值!

  • 抽象
  • 封裝、隱藏
  • 繼承
  • 多態(tài)

類體內(nèi)實現(xiàn)的方法會自動處理為inline函數(shù)。

類對象的內(nèi)存大小之和成員變量有關(guān)

類在內(nèi)存上需要對齊,是為了減輕cup在內(nèi)存上的io次數(shù)

查看類對象的大小的指令:cl className.cpp /d1reportSingleClassLayout類名

一個類可以定義無數(shù)個對象,每個對象都有自己的成員變量,但是他們共享一套成員方法。

有一個問題:Q1:類中的成員方法是怎么知道要處理哪個對象的信息的?

A1:在調(diào)用成員方法的時候會在參數(shù)列表里隱式的給定對象內(nèi)存的地址。如下所示:

類的成員方法一經(jīng)編譯,所有方法參數(shù)都會加一個this指針,接收調(diào)用該方法的對象的地址,即下圖中的CGoods *this

二、掌握構(gòu)造函數(shù)和析構(gòu)函數(shù)

定義一個SeqStack類:

class SeqStack
{

public:
	SeqStack(int size = 10) :_top(-1), _size(size) {
		_pstack = new int[size];
	}
	~SeqStack() {
		cout << this << "~SeqStack()" << endl;
		delete[] _pstack;
		_pstack = nullptr;
	}

	void push(int val) {
		if (full()) {
			resize();
		}
		_pstack[++_top] = val;
	}

	void pop() {
		if (empty()) {
			return;
		}
		--_top;
	}

	int top() {
		return _pstack[_top];
	}
	bool empty() { return _top == -1; }
	bool full() { return _top == _size-1; }

private:
	int* _pstack;

	int _top;

	int _size;

	void resize() {
		int* ptmp = new int[_size * 2];
		for (int i = 0; i < _size; i++) {
			ptmp[i] = _pstack[i];
		}
		delete[] _pstack;
		_pstack = ptmp;
		_size *= 2;
	}
};
/**
	運行過程
*/
int main() {
	SeqStack sq1;

	for (int i = 0; i < 15; i++) {
		sq1.push(rand() % 100);
	}

	while (!sq1.empty()) {
		cout << sq1.top() << " ";
		sq1.pop();
	}

	return 0;
}

三、掌握對象的深拷貝和淺拷貝

.data段的對象是程序啟動的時候構(gòu)造的,程序結(jié)束的時候析構(gòu)的

heap堆上對象是new的時候構(gòu)造的,delete的時候析構(gòu)的

stack棧上的對象是在調(diào)用函數(shù)的時候構(gòu)造的,執(zhí)行完函數(shù)時析構(gòu)的

如果對象占用外部資源,淺拷貝就會出現(xiàn)問題:會導(dǎo)致一個對象指向的內(nèi)存釋放,從而造成另一個對象中的指針成為野指針。所以就要對這樣的對象進行深拷貝,在新的對象中重新開辟一塊空間,使兩者互不干涉。

注意:在面向?qū)ο笾?,要避免使用memcpy進行拷貝,因為對象的內(nèi)存占用不確定,會因為對象中保存指針而造成淺拷貝。需要拷貝的時候只能用for循環(huán)逐一拷貝。

深拷貝:

	SeqStack& operator=(const SeqStack& src) {
		cout << "operator=" << endl;
		//防止自賦值
		if (this == &src) {
			return *this;
		}
		delete[] _pstack;//需要釋放掉自身占用的外部資源
		_pstack = new int[src._size];
		for (int i = 0; i <= src._top; i++) {
			_pstack[i] = src._pstack[i];
		}
		_top = src._top;
		_size = src._size;
		return *this;
	}

	SeqStack(const SeqStack& src) {
		cout << this << "SeqStack(const SeqStack& src)" << endl;
		_pstack = new int[src._size];
		for (int i = 0; i <= src._top; i++) {
			_pstack[i] = src._pstack[i];
		}
		_top = src._top;
		_size = src._size;
	}

四、類和對象應(yīng)用實踐

類Queue:

#pragma once
class CirQueue
{
public:

	CirQueue(int size = 10) {
		_pQue = new int[size];
		_front = _rear = 0;
		_size = size;
	}

	CirQueue(const CirQueue& src) {
		_size = src._size;
		_front = src._front;
		_rear = src._rear;
		_pQue = new int[_size];
		for (int i = _front; i != _rear; i = (i + 1) % _size) {
			_pQue[i] = src._pQue[i];
		}
	}

	~CirQueue() {
		delete[] _pQue;
		_pQue = nullptr;
	}



	CirQueue& operator=(const CirQueue& src) {
		if (this == &src) {
			return *this;
		}
		delete[] _pQue;//需要釋放掉自身占用的外部資源
		_size = src._size;
		_front = src._front;
		_rear = src._rear;
		_pQue = new int[_size];
		for (int i = _front; i != _rear; i = (i + 1) % _size) {
			_pQue[i++] = src._pQue[i];
		}
		return *this;
	}

	void push(int val) {
		if (full()) {
			resize();
		}
		_pQue[_rear] = val;
		_rear = (_rear + 1) % _size;
	}
	void pop() {
		if (empty()) {
			return;
		}
		_front = (_front + 1) % _size;
	}

	int front() {
		return _pQue[_front];
	}

	bool full() {
		return (_rear + 1) % _size == _front;
	}
	
	bool empty () {
		return _front == _rear;
	}



private:
	int* _pQue;

	int _front;

	int _rear;

	int _size;

	void resize() {
		int* ptmp = new int[_size * 2];
		int index = 0;
		for (int i = _front; i != _rear; i=(i+1)%_size) {
			ptmp[index++] = _pQue[i];
		}
		delete[] _pQue;
		_pQue = ptmp;
		_front = 0;
		_rear = index;
		_size *= 2;
	}
};


類String:

#pragma once
#include <algorithm>
class String
{
public:

	String(const char* str = nullptr) {
		if (str != nullptr) {
			_pChar = new char[strlen(str) + 1];
			strcpy(_pChar, str);
		}
		else {
			_pChar = new char[1];
			*_pChar = '\0';
		}
	}

	String(const String& str) {
		_pChar = new char[strlen(str._pChar)+1];
		strcpy(_pChar, str._pChar);
	}

	~String() {
		delete[] _pChar;
		_pChar = nullptr;
	}

	String& operator=(const String& str) {
		if (this == &str) {
			return *this;
		}
		delete[] _pChar;//需要釋放掉自身占用的外部資源

		_pChar = new char[strlen(str._pChar) + 1];
		strcpy(_pChar, str._pChar);
		return *this;
	}

private:
	char* _pChar;
	
};

五、掌握構(gòu)造函數(shù)的初始化列表

初始化列表和寫在構(gòu)造體里有什么區(qū)別:

初始化列表會直接定義并且賦值;放在構(gòu)造體里會先執(zhí)行定義操作,在對定義好的對象賦值。

對象變量是按照定義的順序賦值的,與構(gòu)造函數(shù)中初始化列表的順序無關(guān)。上圖中的ma是0xCCCCCCCC,mb是10,ma未賦值。

六、掌握類的各種成員方法及其區(qū)別

普通成員方法和常成員方法,是可以重載的,常成員方法可以在對象聲明為const的時候調(diào)用。

對象聲明為const的時候,調(diào)用成員方法是通過const對象的指針調(diào)用的,而普通的成員方法默認(rèn)生成的是普通的指針對象,不能直接賦值。

只要是只讀操作的成員方法,一律實現(xiàn)成const常成員方法

三種成員方法:

七、指向類成員的指針

class Test {
public:
	void func() { cout << "call Test::func" << endl; }
	static void static_func() { cout << "call Test::static_func" << endl; }

	int ma;
	static int mb;
};

int Test::mb=0;

int main() {

	Test t1;
	Test *t2 = new Test();//在堆上生成對象,并用指針指向

	//使用指針調(diào)用類成員方法(前面要加類的作用域Test::)
	void (Test:: * pfunc)() = &Test::func;
	(t1.*pfunc)();
	(t2->*pfunc)();

	//定義指向static的類成員方法
	void(*pfunc1)() = &Test::static_func;
	(*pfunc1)();

	//使用指針指向類成員變量,前面要加類的作用域Test::
	int Test::* p = &Test::ma;
	t1.*p = 20;
	cout << t1.*p << endl;

	t2->*p = 30;
	cout << t2->*p << endl;

	int* p1 = &Test::mb;
	*p1 = 40;
	cout << *p1 << endl;

	delete t2;
	return 0;
}

輸出為:

網(wǎng)站題目:三、C++面向?qū)ο?類和對象那些你不知道的細(xì)節(jié)原理
文章位置:http://chinadenli.net/article10/dsoipgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)軟件開發(fā)、ChatGPT、定制開發(fā)、全網(wǎng)營銷推廣、網(wǎng)站設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護公司