1. 程式人生 > >【C++ 程式語言學習1】

【C++ 程式語言學習1】

2019.01.03  C++學習

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1、析構器&構造器

2、訪問控制-C++提供了一種用來保護類裡的方法和屬性的手段!

public  protected  private

  • 在編寫類定義程式碼時,應該從Public:開始寫,然後是protected:,最後是private

3、覆蓋方法&過載方法

過載機制使你可以定義多個同名的方法(函式),只是它們的輸入引數必須不同。(因為編譯器是依靠不同的輸入引數來區分不同的方法)。

  • 對方法(函式)進行過載一定要有的放矢,過載的方法(函式)越多,程式就越不同意看懂。
  • 對方法進行覆蓋(注意區分覆蓋和過載)時一定要看仔細,因為只要宣告的輸入引數和返回值與原來不一致,你編寫出來的就將是一個過載方法而不是覆蓋方法。
  • 繼承之後不能過載;

4、友元關係

一個完全無關的類由於某些特殊的原因需要訪問到某個protected或private成員,怎麼辦?如果把所有的東西都宣告成public,這樣雖讓能達到目的,但是就把原來設法保護的方法或屬性又暴露出來了!!!

友元關係式類之間的一個特殊關係,這種關係允許不僅允許友元類訪問對方的public方法和屬性,還允許友元訪問對方的protected和private方法和屬性。使用友元關係時,只要在類聲明裡的某個地方加上一條friend class**就行了

2019.01.04  C++學習

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1、靜態物件和靜態方法

       面對物件程式設計技術的一個重要特徵是用一個物件把資料和對資料處理的方法封裝在一起。物件(也可以說某個類的例項)來呼叫方法,每個方法只處理呼叫它的那個物件所包含的資料,所有的資料都屬於同一個物件。如果我們所需要的功能或資料不屬於某個特性的物件,而是屬於整個類的,該怎麼辦?

舉個例子:

            假設現在需要統計一下有多少隻活的動物,那麼我們就需要有一個計數器的變數:每誕生一直寵物就給寵物的計數器加1,每掛掉一隻,就減去1;我們首先想到的是建立一個全域性變數來充當這個計數器,但這麼做的後果是程式中任何的程式碼都可以修改這個計數器,稍不小心就會在程式裡留下一個難以排查的漏洞!!!我們真正需要的是一個只在建立或刪除物件時候才允許訪問的計數器。這個問題必須使用C++的靜態屬性和靜態函式才能完美地得到解決。C++允許我們把一個或多個成員宣告為屬於某個類,而不是僅屬於該類的物件。

           這麼做的好處是程式設計師可以在沒有建立任何物件的情況下呼叫有關的方法。另一個好處是能夠讓有關的資料仍在該類的所有物件間共享。

#include <iostream>
#include <string>

class Pet
{
public:
	Pet(std::string theName);
	~Pet();

	static int  getCount();

protected:
	std::string name;
private:
	static int count;
};

class Dog : public Pet
{
public :
	Dog(std::string theName);
};

class Cat : public Pet
{
public:
	Cat(std::string theName);
};

int Pet::count = 0;   //1.編譯器為count分配記憶體;2.把count這個變數初始化為0;

Pet::Pet(std::string theName)
{
	name = theName ;
	count++;
	std::cout<<"一隻寵物出生了,它的名字叫:"<<name<<"\n";
};

Pet::~Pet() // Pet的析構器
{
	count--;
	std::cout<<name<<"掛掉了\n";
}

int Pet::getCount()
{
	return count;
}

Dog::Dog(std::string theName) : Pet(theName)
{
}

Cat::Cat(std::string theName) : Pet(theName)
{
}

int main()
{
	Dog dog("Tom");
	Cat cat("Jerry");

	std::cout<<"\n已經誕生了"<<Pet::getCount()<<"只寵物!\n\n";

	{                       //大括號的作用
		Dog dog_2("Tom_2");
		Cat cat_2("Jerry_2");

		std::cout<<"\n現在呢,已經誕生了"<<Pet::getCount()<<"只寵物!\n\n";
	}
	std::cout<<"\n現在還剩下"<<Pet::getCount()<<"只寵物!\n\n";

	
	getchar();
	//system("pause");
	return 0;
}

執行結果如下圖所示: