最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

關(guān)于C++繼承你可能會(huì)忽視的點(diǎn)

 更新時(shí)間:2022年02月18日 10:07:44   作者:^jhao^  
繼承是面向?qū)ο笕筇匦灾?有些類與類之間存在特殊的關(guān)系,下面這篇文章主要給大家介紹了關(guān)于C++繼承你可能會(huì)忽視的點(diǎn),文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

繼承是使代碼復(fù)用的一種重要的手段,我們?cè)贑語(yǔ)言時(shí)期寫(xiě)的swap函數(shù)邏輯,通常會(huì)單獨(dú)寫(xiě)出來(lái)再給其他函數(shù)復(fù)用,這個(gè)繼承可以理解成是類級(jí)別的一個(gè)復(fù)用,它允許我們?cè)谠蓄惖幕A(chǔ)上進(jìn)行擴(kuò)展,增加新的功能。

一、什么是繼承

舉個(gè)例子,當(dāng)我們使用一個(gè)結(jié)構(gòu)體去描述一個(gè)學(xué)生的信息時(shí),我們可以用到以下的這樣一個(gè)組織方式:

struct Student
{
	char sex[20];//性別
	int age;//年齡
	char stu_id;//學(xué)號(hào)
	//.....
};

當(dāng)我們要描述一名老師的時(shí)候我們這個(gè)時(shí)候可能就是更改學(xué)生信息當(dāng)中的部分的信息,例如上面的性別和年齡是可以通用的,而學(xué)號(hào)只需更改成工號(hào)即可。那么我們應(yīng)該怎么去達(dá)到復(fù)用的邏輯呢?

:我們可以寫(xiě)一個(gè)struct People,讓struct Student和struct Teacher去復(fù)用它。

struct People
{
	char sex[20];//性別
	int age;//年齡
};
struct Student
{
	struct People p;
	char stu_id;//學(xué)號(hào)
	//.....
};
struct Teacher
{
	struct People p;
	char work_id;//工號(hào)
	//.....
};

這樣子我們用之前的C語(yǔ)言的知識(shí)就可以完成一個(gè)簡(jiǎn)單的復(fù)用,這樣子做會(huì)有幾個(gè)不好的地方:

  • 對(duì)于People內(nèi)部的訪問(wèn)會(huì)比起訪問(wèn)他自己內(nèi)部定義的變量麻煩一點(diǎn)(就是如定義了Teacher t;要訪問(wèn)age需要 t.p.age)。
  • 若基類(父類)想要對(duì)于派生類(子類)有所隱藏,即并不想讓所有的成員函數(shù)/成員變量都給子類所繼承的時(shí)候,我們用這種方式很難做到。

基于以上的問(wèn)題,C++給出了一套繼承邏輯。

上述第一個(gè)問(wèn)題就解決了,我們可以直接在People t,直接訪問(wèn)基類的成員,第二個(gè)問(wèn)題,對(duì)于一些我們想要隱藏的成員函數(shù)/成員變量(即不讓子類可見(jiàn)),我們可以通過(guò)繼承方式來(lái)控制,在此之前先鋪墊一個(gè)知識(shí)點(diǎn)。

上圖若是開(kāi)過(guò)c++這門(mén)課的同學(xué)肯定都有見(jiàn)過(guò),其中的最左列是表明基類的被繼承的成員是什么類型的,第一行則是以哪種形式繼承。

基類的其他成員在子類的訪問(wèn)方式 == Min(成員在基類的訪問(wèn)限定符,繼承方式),public > protected > private 。

其中protected成員變量我們?cè)诶^承這塊見(jiàn)得會(huì)比較多,下面我們比較一下public/protected/private的在繼承當(dāng)中的作用。

  • 若基類的成員當(dāng)中為public,則說(shuō)明他支持類內(nèi),類外部都可以去訪問(wèn)他,而這時(shí)候我們常用public繼承,因?yàn)榛惗家呀?jīng)開(kāi)放了這個(gè)成員變量,派生類用其他兩種方式繼承都會(huì)讓他在派生類的類外部無(wú)法訪問(wèn),所以實(shí)際上public繼承是最常用的。
  • 若基類的成員當(dāng)中是protected類型,表明基類允許子類當(dāng)中可以使用這個(gè)成員,但是不希望類外部使用,protected的訪問(wèn)限定符只是對(duì)類外部上鎖,而類內(nèi)是可以隨意使用的,這樣實(shí)際上也是封裝性的一種體現(xiàn)。
  • 若基類的成員是private類型,表明不希望子類和外部訪問(wèn),在子類當(dāng)中不可見(jiàn),不可見(jiàn)即子類當(dāng)中無(wú)法訪問(wèn)該成員。但是他是否存在于派生類當(dāng)中?是存在的。

實(shí)踐是檢驗(yàn)真知的唯一標(biāo)準(zhǔn),下面我們?cè)囋囀欠駊rivate的成員在子類真的存在:

class People
{
public:
	char address;//住址
protected:
	double sex;//性別
private:
	int age;//年齡
};
class Student : protected People
{

	char stu_id[20];//學(xué)號(hào)
	//.....
};
struct Teacher :public People
{
	double work_id;//工號(hào)
	//.....
};
int main()
{

	Teacher t;
	cout << sizeof(t) << endl;//對(duì)t變量的大小測(cè)試
	printf("%p,%p", &t.address,&t.work_id);

	return 0;
}

驗(yàn)證結(jié)果為32,即下圖所示,我們可以得知People的元素是在Teacher之上的。

示意圖:

倘若強(qiáng)行訪問(wèn),則會(huì)報(bào)錯(cuò)。到此問(wèn)題2的答案也清晰了。

不推薦protected繼承的原因:

class People
{
public:
	char address;//住址
protected:
	double sex;//性別
private:
	int age;//年齡
};
struct Student : protected People
{

	char stu_id[20];//學(xué)號(hào)
	//.....
};
int main()
{
	Student s1;
	People p = s1;//error
	return 0;
}

上面這個(gè)protected繼承后子類對(duì)象賦值給基類報(bào)錯(cuò)!

其實(shí)是因?yàn)楦割惖膒ublic對(duì)象address在以protected方式繼承時(shí)相當(dāng)于在類外部不可訪問(wèn),當(dāng)賦值給People對(duì)象時(shí),權(quán)限被放大,即若支持賦值,子類address是不對(duì)外開(kāi)放的,而父類卻把成員變量公開(kāi)了!

解決方案:使用public繼承!

二、基類與派生類的賦值轉(zhuǎn)換

2.1天然支持的理解

這個(gè)點(diǎn)是一個(gè)十分重要的點(diǎn),在學(xué)習(xí)java語(yǔ)言的時(shí)候,經(jīng)常聽(tīng)到上轉(zhuǎn)型,其實(shí)也就是c++當(dāng)中將子類的對(duì)象賦值給父類,即People t = student s;類似這種,這個(gè)過(guò)程是天然支持的,接下來(lái)敘述一下天然支持的含義。

預(yù)備知識(shí)

int i = 0;
double b = i;//1
double& b =i ;//2 error
const double& b = i ;//3

從初識(shí)c語(yǔ)言的時(shí)候,我們就發(fā)現(xiàn)上面代碼的第一條是沒(méi)有問(wèn)題的,這是因?yàn)橄嘟愋驮诰鹊徒o精度高的時(shí)候是不會(huì)出現(xiàn)問(wèn)題的。這是因?yàn)榫幾g器會(huì)在此期間生成一塊臨時(shí)空間(臨時(shí)空間具有常性),用i生成一個(gè)double類型的i再賦值給b。

在上面的2代碼的時(shí)候?yàn)槭裁磿?huì)出錯(cuò)呢?原因很簡(jiǎn)單,臨時(shí)空間具有常性,臨時(shí)空間是放到靜態(tài)區(qū)當(dāng)中的,不可修改,當(dāng)用double&時(shí)相當(dāng)于會(huì)對(duì)權(quán)限進(jìn)行放大(即b可能會(huì)更改i的內(nèi)容),所以我們加入const屬性的時(shí)候代碼3也就能夠跑過(guò)了。

上面的子類給父類為什么就是天然支持的呢?

int main()
{
	Teacher t;
	People& p = t;//true
	People* p2 = &t;//true
	People p3 = t;//true
	return 0;
}

上面的程序正常運(yùn)行,父類引用子類對(duì)象完全沒(méi)有問(wèn)題!所以我們才說(shuō)這是天然支持的,不像上面例子是通過(guò)轉(zhuǎn)換而來(lái)的。

這種派生類對(duì)象賦值給基類的對(duì)象/基類的指針/基類的引用,稱之為切片,這種說(shuō)法是十分貼切的。通過(guò)切去子類的自己定義的部分在給到基類。

這里會(huì)有一些值得注意的點(diǎn):

基類的對(duì)象不能賦值給派生類對(duì)象??!

基類的指針是可以通過(guò)強(qiáng)制類型轉(zhuǎn)換來(lái)賦值給派生類的指針,但是基類的指針必須原先是指向派生類對(duì)象才是安全的。倘若基類是多態(tài)類型,可以用RTTI當(dāng)中的dynamic cast來(lái)進(jìn)行識(shí)別后進(jìn)行安全轉(zhuǎn)換。(后序博客會(huì)將,這里簡(jiǎn)單說(shuō)明就是使用dynamic cast,他會(huì)判斷指針指向的是不是派生類對(duì)象,如果是就轉(zhuǎn)換成功,不是就會(huì)返回null)

對(duì)于上面第二點(diǎn)做一個(gè)解釋,就是如果People * pp指向的是一個(gè)People的對(duì)象,那么當(dāng)他給到派生類的指針的時(shí)候,派生類指針是有可能訪問(wèn)到未初始化的那部分。因?yàn)檎驹?code>派生類指針的角度,他并不知道自己的成員是沒(méi)有被定義的,倘若它使用了未初始化數(shù)據(jù),就會(huì)產(chǎn)生越界報(bào)錯(cuò)??!
相反,如果原先的pp指針指向的是派生類對(duì)象(天然支持的),那么當(dāng)我們pp給到派生類的時(shí)候,對(duì)于派生類的而言,它的數(shù)據(jù)都是初始化好的,所以這個(gè)時(shí)候是沒(méi)有問(wèn)題的。

三、繼承當(dāng)中的作用域

在繼承體系中基類和派生類都有獨(dú)立的作用域!!

代碼如下:

class People
{
public:
	char address[20] = "chang an";//住址
	void func(int i)
	{
		cout << "People func\n";
	}
protected:
	char sex[20] = "nan";//性別
private:
	int age = 19;//年齡
};
struct Student : public People
{
	
	char stu_id[20] = "1010";//學(xué)號(hào)
	//.....
	void func()
	{
		cout << "Student func\n";
	}
};

int main()
{
	People p;
	Student s;
	s.func(); //true
	s.func(1);//err
	return 0;
}

從上面的例子可以看出,倘若基類和子類都在同一個(gè)作用域,那么func的有參和無(wú)參是構(gòu)成重載的,但是編譯器這里報(bào)錯(cuò),說(shuō)明重載的一個(gè)重要條件不滿足,即函數(shù)不在同一作用域當(dāng)中。

這種子類成員將父類的成員屏蔽的情況,叫做隱藏,也叫重定義,倘若需要調(diào)用父類的函數(shù)需要在函數(shù)前顯示調(diào)用(指名類域)即可。

注意:

  • 繼承體系當(dāng)中不建議定義同名的成員,因?yàn)闀?huì)引發(fā)誤解。
  • 但是在派生類的默認(rèn)成員函數(shù)當(dāng)中會(huì)用到這種語(yǔ)法,所以這種語(yǔ)法也是必不可少的??!
  • 成員函數(shù)和成員變量都如此,基類定義相同名字的都會(huì)對(duì)父類進(jìn)行隱藏,調(diào)用都要顯示調(diào)用。

四、派生類的默認(rèn)構(gòu)造成員函數(shù)

1. 派生類的構(gòu)造函數(shù)必須調(diào)用基類的構(gòu)造函數(shù)初始化基類的那一部分成員。如果基類沒(méi)有默認(rèn)的構(gòu)造函數(shù),則必須在派生類構(gòu)造函數(shù)的初始化列表階段顯示調(diào)用。

2. 派生類的拷貝構(gòu)造函數(shù)必須調(diào)用基類的拷貝構(gòu)造完成基類的拷貝初始化。

3. 派生類的operator=必須要調(diào)用基類的operator=完成基類的復(fù)制。

4. 派生類的析構(gòu)函數(shù)會(huì)在被調(diào)用完成后自動(dòng)調(diào)用基類的析構(gòu)函數(shù)清理基類成員。因?yàn)檫@樣才能保證派生類對(duì)象先清理派生類成員再清理基類成員的順序。

5. 派生類對(duì)象初始化先調(diào)用基類構(gòu)造再調(diào)派生類構(gòu)造。

6. 派生類對(duì)象析構(gòu)清理先調(diào)用派生類析構(gòu)再調(diào)基類的析構(gòu)。

總結(jié)前面的6個(gè)規(guī)則,個(gè)人的結(jié)論:

  • 構(gòu)造函數(shù),拷貝構(gòu)造,operator=三種情況,都要調(diào)用父類對(duì)應(yīng)的構(gòu)造函數(shù)/拷貝構(gòu)造/operator=進(jìn)行對(duì)父類的成員變量的初始化,并且倘若父類沒(méi)有默認(rèn)的構(gòu)造函數(shù)的時(shí)候(比如父類寫(xiě)了帶參的構(gòu)造函數(shù)),我們就要顯式調(diào)用(Person(參數(shù)…),Person::operator=(參數(shù)…))
  • 析構(gòu)函數(shù)只需要清理子類定義的資源,由于在構(gòu)造函數(shù)當(dāng)中我們是先對(duì)父類的成員先進(jìn)行構(gòu)造,后對(duì)子類的成員進(jìn)行構(gòu)造。由先構(gòu)造后析構(gòu)的順序,所以我們是在析構(gòu)函數(shù)當(dāng)中析構(gòu)子類的資源,析構(gòu)函數(shù)調(diào)用完后編譯器自動(dòng)幫我們調(diào)用父類的析構(gòu)函數(shù)。

在派生類當(dāng)中基類為一個(gè)自定義類型,會(huì)自動(dòng)調(diào)用父類的構(gòu)造函數(shù)進(jìn)行初始化。在拷貝構(gòu)造當(dāng)中,由于子類把父類的部分當(dāng)做自定義類型,倘若沒(méi)有顯示調(diào)用拷貝構(gòu)造,就會(huì)調(diào)用到構(gòu)造函數(shù)上面對(duì)父類的部分進(jìn)行構(gòu)造。

在子類當(dāng)中直接對(duì)父類單獨(dú)的成員初始化是錯(cuò)誤的,一定要把父類當(dāng)做一個(gè)整體進(jìn)行初始化!

4.0什么時(shí)候需要寫(xiě)6個(gè)默認(rèn)成員函數(shù)

拋出結(jié)論:

1. 若父類沒(méi)有默認(rèn)構(gòu)造函數(shù)/默認(rèn)拷貝構(gòu)造函數(shù)或者有需要對(duì)成員的初始化(可以在聲明處給缺省值),或者編譯器提供的淺拷貝行為不能滿足我們的需求。

2. 當(dāng)我們成員變量中采用T*,自己維護(hù)在堆上開(kāi)的空間時(shí),我們往往需要對(duì)除取地址重載外的其余默認(rèn)成員函數(shù)進(jìn)行編寫(xiě)。因?yàn)槲覀儧](méi)有選擇容器,自己動(dòng)手維護(hù)堆上的資源時(shí),若采用編譯器默認(rèn)生成的值拷貝的方式,分分鐘出錯(cuò)!

4.1構(gòu)造函數(shù)

#include<iostream>
using namespace std;
class People
{
public:
	People()
	{
		cout << "People()\n";
	}
	//p1(p)
	People(const People& p)
	{
		cout << "People(const People& p)" << endl;
	}
	// p1 = p
	People& operator=(const People& p)
	{
		cout << "People& operator=(const People& p)" << endl;
		return *this;
	}

private:
	char name[20];
	char address[20];
	char tele[20];
};

class Student :public People
{
public:
//無(wú)寫(xiě)構(gòu)造
private:
	int id;
};

int main()
{
	Student t;
	return 0;
}

在沒(méi)有寫(xiě)派生類的構(gòu)造函數(shù)時(shí),派生類會(huì)在編譯器生成的默認(rèn)構(gòu)造函數(shù)當(dāng)中在初始化列表處調(diào)用父類的構(gòu)造函數(shù)對(duì)父類的資源進(jìn)行初始化。

當(dāng)我們寫(xiě)了子類的構(gòu)造函數(shù),但是沒(méi)有顯示調(diào)用父類的構(gòu)造函數(shù),編譯器依舊會(huì)在初始化列表處幫我們調(diào)用父類的構(gòu)造函數(shù)對(duì)父類的資源進(jìn)行初始化。

C++規(guī)定了派生類要先對(duì)父類資源進(jìn)行初始化,所以不管我們有沒(méi)有顯示調(diào)用父類的構(gòu)造函數(shù),編譯器都會(huì)幫我們調(diào)用。下面展示一下如何顯示調(diào)用

	Student()
    	:People()
	{
		cout << "Student()" << endl;
	}

倘若父類沒(méi)有寫(xiě)默認(rèn)的構(gòu)造函數(shù),這個(gè)時(shí)候只能用顯示調(diào)用的方法對(duì)父類的資源初始化了。

調(diào)用方法看起來(lái)有點(diǎn)奇怪,用起來(lái)有點(diǎn)像創(chuàng)建匿名對(duì)象,但是便于理解,我們可以把他理解成子類當(dāng)中將父類看做自定義類型,所以會(huì)去默認(rèn)調(diào)用它的構(gòu)造函數(shù),而我們沒(méi)有顯示寫(xiě)出父類的對(duì)象,所以初始化父類的形式用的是類名+(參數(shù)...)

4.2拷貝構(gòu)造

1.當(dāng)我們沒(méi)有編寫(xiě)拷貝構(gòu)造函數(shù)的時(shí)候,我們發(fā)現(xiàn)編譯器幫我們默認(rèn)生成的拷貝構(gòu)造會(huì)自動(dòng)調(diào)用父類的拷貝構(gòu)造。

那么我們是否跟構(gòu)造函數(shù)一樣只拷貝子類的資源即可,編譯器是否會(huì)幫我們也在初始化列表處對(duì)父類資源進(jìn)行拷貝?
不會(huì)

看下面這張圖,我們發(fā)現(xiàn)拷貝構(gòu)造當(dāng)中調(diào)用了父類的構(gòu)造函數(shù)

有的同學(xué)就會(huì)有疑惑了,實(shí)際上拷貝構(gòu)造也是構(gòu)造,在初始化列表處,對(duì)于子類而言,父類相當(dāng)于一個(gè)自定義類型對(duì)象,子類會(huì)調(diào)用父類的構(gòu)造函數(shù)對(duì)父類的資源進(jìn)行初始化。

解決方法:顯示調(diào)用父類的拷貝構(gòu)造即可,所以拷貝構(gòu)造這里我們一定要要寫(xiě)就一定要顯示調(diào)用父類的拷貝構(gòu)造。

Student(const Student& s)
		:People(s)
	{
		cout << "Student(const Student& s)" << endl;
	}

4.3賦值重載

老樣子,先看看編譯器生成的默認(rèn)的operator=是怎樣的。

很顯然,編譯器會(huì)自動(dòng)調(diào)用父類的operator=對(duì)父類的部分進(jìn)行賦值,賦值重載與拷貝構(gòu)造一樣,需要我們顯示調(diào)用父類的賦值重載,否則雖然不會(huì)報(bào)錯(cuò),但是不滿足我們所需要的行為。

所以我們?cè)诤瘮?shù)體內(nèi)調(diào)用父類oeperator=即可:

五、菱形繼承和菱形虛擬繼承

單/多繼承的定義:

單繼承:一種繼承機(jī)制。其中每個(gè)子類只能繼承單一的超類。

多繼承:多繼承可以看作是單繼承的擴(kuò)展。所謂多繼承是指派生類具有多個(gè)基類,派生類與每個(gè)基類之間的關(guān)系仍可看作是一個(gè)單繼承。

多繼承本身并沒(méi)有問(wèn)題,但是它的擴(kuò)展形成菱形繼承出現(xiàn)了問(wèn)題,讓我們學(xué)習(xí)的過(guò)程中需要學(xué)習(xí)更加復(fù)雜的解決方案。

5.1菱形繼承

以下面這張圖為例。

struct Base {
	int base;
};

struct A :public Base
{
	int a;
};

struct C :public Base
{
	int c;
};

struct D :public A ,public C
{
	int d;
};

在沒(méi)有虛繼承前,對(duì)象模型如下圖,可以看出base在D有出現(xiàn)了兩份,也就是在D所創(chuàng)建的對(duì)象當(dāng)中都會(huì)出現(xiàn)二義性和數(shù)據(jù)冗余的問(wèn)題!

解決方案

虛繼承,在腰部的類繼承時(shí)添加virtual關(guān)鍵字。

struct Base {
	int base;
};

struct A :virtual public Base
{
	int a;
};

struct C :virtual public Base
{
	int c;
};

struct D :public A ,public C
{
	int d;
};

int main()
{
	D d;
	d.c = 1;
	d.d = 2;
	d.a = 3;
	return 0;
}

測(cè)試平臺(tái):vs2013/32位

虛繼承后的內(nèi)存對(duì)象成員模型,其中每個(gè)腰部虛繼承的A,C的對(duì)象都多了一個(gè)指針,由于我們是小端機(jī),所以對(duì)應(yīng)過(guò)去我們能看到指向的空間當(dāng)中對(duì)應(yīng)8字節(jié),表中頭4字節(jié)00 00 00 00與多態(tài)有關(guān),下面的則是偏移量,由于虛繼承后只有一份A對(duì)象的成員變量,并且表結(jié)構(gòu)需要8字節(jié)的空間,所以A,C對(duì)象當(dāng)中存放的是虛基表指針,指向的是虛基表,虛基表一般是放在代碼段 當(dāng)中的。

為什么C,A需要去找屬于自己的Base?

基類與派生類的賦值轉(zhuǎn)換時(shí),需要進(jìn)行切片,需要將A,C當(dāng)中的base變量才能賦值給b。

int main()
{
	Base b = A();
	Base b2 = C();
	return 0;
}

上述圖中B是否虛繼承都可以,只要A,C虛繼承,D中都不會(huì)出現(xiàn)二義性了。

六、繼承的總結(jié)

在繼承這塊實(shí)際上是c++語(yǔ)法復(fù)雜的一處體現(xiàn)了,有了多繼承,就有了菱形繼承,相對(duì)應(yīng)他的解決方案來(lái)了,但是我們可以發(fā)現(xiàn)這套解決方案讓他的底層實(shí)現(xiàn)必定變得復(fù)雜了起來(lái),所以正常使用的時(shí)候我們并不推薦去折騰菱形繼承,在java等語(yǔ)言都把多繼承這一塊砍掉了,使用多繼承的同時(shí)就要考慮復(fù)雜度和性能上的問(wèn)題。

繼承和組合

繼承是一種復(fù)用的方式,但不是唯一方式!

  • public繼承是一種is-a的關(guān)系,每一個(gè)派生類都是一個(gè)基類對(duì)象。
  • 組合是一種has-a的關(guān)系,假設(shè)B組合了A,則每個(gè)B對(duì)象都有一個(gè)A對(duì)象。
  • 繼承方式的復(fù)用常稱之為白箱復(fù)用,在繼承方式中,基類的內(nèi)部細(xì)節(jié)對(duì)子類可見(jiàn),這一定程度上破壞了基類的封裝,伴隨著基類的改變,對(duì)派生類的改變很大。并且兩者依賴關(guān)系強(qiáng),耦合度大。
  • 對(duì)象組合式繼承之外的復(fù)用選擇,對(duì)象組合要求被組合對(duì)象提供良好的接口定義。這種復(fù)用稱之為黑箱復(fù)用,對(duì)象的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)是不可見(jiàn)的。耦合度低。

實(shí)際工程中能用繼承和組合就用組合,組合的耦合度低,代碼的維護(hù)性好,但是繼承在有些關(guān)系就適合用繼承就用繼承,并且要實(shí)現(xiàn)多態(tài)就一定要用繼承。

總結(jié)

繼承作為c++的一塊難點(diǎn),本篇博客不免有些錯(cuò)誤,歡迎各位大佬指出批評(píng)!

到此這篇關(guān)于關(guān)于C++繼承你可能會(huì)忽視的點(diǎn)的文章就介紹到這了,更多相關(guān)C++繼承忽視的點(diǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++淺析構(gòu)造函數(shù)的特性

    C++淺析構(gòu)造函數(shù)的特性

    構(gòu)造函數(shù)主要作用在于創(chuàng)建對(duì)象時(shí)為對(duì)象的成員屬性賦值,構(gòu)造函數(shù)由編譯器自動(dòng)調(diào)用,無(wú)須手動(dòng)調(diào)用;析構(gòu)函數(shù)主要作用在于對(duì)象銷毀前系統(tǒng)自動(dòng)調(diào)用,執(zhí)行一 些清理工作
    2022-07-07
  • c語(yǔ)言中的二級(jí)指針做函數(shù)參數(shù)說(shuō)明

    c語(yǔ)言中的二級(jí)指針做函數(shù)參數(shù)說(shuō)明

    這篇文章主要介紹了c語(yǔ)言中的二級(jí)指針做函數(shù)參數(shù)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • C語(yǔ)言進(jìn)階:指針的進(jìn)階(3)

    C語(yǔ)言進(jìn)階:指針的進(jìn)階(3)

    這篇文章主要介紹了C語(yǔ)言指針詳解及用法示例,介紹了其相關(guān)概念,然后分享了幾種用法,具有一定參考價(jià)值。需要的朋友可以了解下
    2021-09-09
  • c++ 如何在libuv中實(shí)現(xiàn)tcp服務(wù)器

    c++ 如何在libuv中實(shí)現(xiàn)tcp服務(wù)器

    這篇文章主要介紹了c++ 如何在libuv中實(shí)現(xiàn)tcp服務(wù)器,幫助大家更好的理解和使用libuv,感興趣的朋友可以了解下
    2021-02-02
  • C++ LeetCode1805字符串不同整數(shù)數(shù)目

    C++ LeetCode1805字符串不同整數(shù)數(shù)目

    這篇文章主要為大家介紹了C++ LeetCode1805字符串不同整數(shù)數(shù)目,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • C++的static關(guān)鍵字及變量存儲(chǔ)位置總結(jié)

    C++的static關(guān)鍵字及變量存儲(chǔ)位置總結(jié)

    今天看博文時(shí),看到了c++的static關(guān)鍵字的一些總結(jié),還涉及到了一些代碼的存儲(chǔ)位置;接下來(lái)為您詳細(xì)呈現(xiàn)
    2012-11-11
  • 如何用C語(yǔ)言畫(huà)一個(gè)“圣誕樹(shù)”

    如何用C語(yǔ)言畫(huà)一個(gè)“圣誕樹(shù)”

    這篇文章主要介紹了如何用C語(yǔ)言畫(huà)一個(gè)“圣誕樹(shù)”,感興趣的小伙伴們可以參考一下
    2015-12-12
  • 深入分析C語(yǔ)言存儲(chǔ)類型與用戶空間內(nèi)部分布

    深入分析C語(yǔ)言存儲(chǔ)類型與用戶空間內(nèi)部分布

    這篇文章主要介紹了C語(yǔ)言存儲(chǔ)類型與用戶空間內(nèi)部分布,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-12-12
  • C語(yǔ)言中printf()緩沖問(wèn)題詳解

    C語(yǔ)言中printf()緩沖問(wèn)題詳解

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中printf()緩沖問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • c++帶有string的結(jié)構(gòu)體賦值和清零問(wèn)題

    c++帶有string的結(jié)構(gòu)體賦值和清零問(wèn)題

    這篇文章主要介紹了c++帶有string的結(jié)構(gòu)體賦值和清零問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評(píng)論

利辛县| 泰和县| 清水县| 普洱| 遂川县| 长沙市| 东安县| 保德县| 板桥市| 都兰县| 五常市| 怀柔区| 津市市| 黔东| 盖州市| 尚志市| 平武县| 宽城| 固阳县| 淄博市| 衡阳县| 军事| 泰和县| 池州市| 安丘市| 肇州县| 稻城县| 荃湾区| 黑水县| 蓬安县| 邢台市| 金沙县| 济南市| 砀山县| 石家庄市| 新源县| 招远市| 同德县| 石首市| 鹿泉市| 九江县|