C++必備基礎(chǔ)知識(shí)和編程規(guī)范
“只有客戶(hù)發(fā)展了,才有我們的生存與發(fā)展!”這是成都創(chuàng)新互聯(lián)公司的服務(wù)宗旨!把網(wǎng)站當(dāng)作互聯(lián)網(wǎng)產(chǎn)品,產(chǎn)品思維更注重全局思維、需求分析和迭代思維,在網(wǎng)站建設(shè)中就是為了建設(shè)一個(gè)不僅審美在線,而且實(shí)用性極高的網(wǎng)站。創(chuàng)新互聯(lián)對(duì)成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站開(kāi)發(fā)、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站優(yōu)化、網(wǎng)絡(luò)推廣、探索永無(wú)止境。C語(yǔ)言是面向過(guò)程的程序設(shè)計(jì),強(qiáng)調(diào)程序的執(zhí)行順序,自上而下,而C++是面向?qū)ο蟮某绦蛟O(shè)計(jì),將程序看做多個(gè)對(duì)象組成,每個(gè)對(duì)象有自己的屬性(變量)和行為(函數(shù))。
2.屬性是描述對(duì)象特征的數(shù)據(jù),行為是對(duì)象能進(jìn)行的操作,如英雄聯(lián)盟里每一個(gè)英雄都有自己的屬性(生命值,法力值,防御力,***力)和行為(普通***,施放技能QWER)。
C++編程規(guī)范:
類(lèi)名第一個(gè)單詞大寫(xiě),數(shù)據(jù)成員和變量小寫(xiě);
成員函數(shù)第二個(gè)單詞首字母大寫(xiě);
成員函數(shù)類(lèi)外定義,類(lèi)內(nèi)聲明;
Set和構(gòu)造函數(shù)的參數(shù)與數(shù)據(jù)同名,用this訪問(wèn);
一、什么是類(lèi)和對(duì)象
1.類(lèi)(具有共性的實(shí)體)其實(shí)是C語(yǔ)言結(jié)構(gòu)體的升級(jí)版,對(duì)象在程序中可以理解為編譯器為之分配了存儲(chǔ)空間的變量。
假如定義了一個(gè)帶函數(shù)的結(jié)構(gòu)體,然后把struct 改成class
class Stu
{
int id;
char *name;
void study()
{
cout< } }; 在這里class Stu就是類(lèi),用這個(gè)類(lèi)定義一個(gè)變量Stu czy; czy就是對(duì)象 可以對(duì)對(duì)象進(jìn)行操作如 czy.id =1;czy.study(); 在C++中后綴為*.cpp,編譯器用g++,包含頭文件#include 輸入輸出用cin,cout,需使用命名空間using namespace std; 2.命名空間用于解決命名重復(fù)問(wèn)題,自定義作用域?qū)⒍鄠€(gè)變量和函數(shù)封裝起來(lái),如: namespace myName { int num = 10; void fun() { std::cout<<"in mynamespace fun\n"; } } 然后在main函數(shù)中引用, myName::fun(); 3.I/O流 cin>> 和cout<< ,就是C語(yǔ)言中的printf()和scanf()但是不用指定格式,cin輸入數(shù)據(jù)類(lèi)型不匹配時(shí)不讀取,多個(gè)輸入之間以空格分隔,遇到空格時(shí)結(jié)束,不檢查數(shù)據(jù)長(zhǎng)度,有緩沖區(qū)溢出的危險(xiǎn)。所以有了cin.getline(str, sizeof(str)),類(lèi)似于c語(yǔ)言的fgets(); 4.C++中結(jié)構(gòu)名可以直接作為類(lèi)型名(自動(dòng)typedef),與C語(yǔ)言不同,c++中const修飾的值為常量,存在文字常量區(qū)。 5.缺省函數(shù) 帶有缺省參數(shù)的函數(shù),如void fun(int num = 0); 6.重載函數(shù) 允許有同名的函數(shù)出現(xiàn),但是參數(shù)不同,返回值不能作為區(qū)分的標(biāo)志,不能與缺省函數(shù)同名。 7.類(lèi)型轉(zhuǎn)換 char a = char(num); char *p = char *(num); 8.new/delete運(yùn)算符 還記得C語(yǔ)言中的malloc和free吧,C語(yǔ)言中free釋放后,指針和空間都還在,但是指針已經(jīng)沒(méi)有了對(duì)空間的操作權(quán)(好像還能讀?。?,所以應(yīng)該使其指向NULL new和delete不是函數(shù)是運(yùn)算符 int num = 10;//棧區(qū)定義一個(gè)變量 如int *p = new int(100);//在堆區(qū)開(kāi)辟了一塊4個(gè)字節(jié)的空間,里面存了一個(gè)int型的數(shù)100 而char *str = new char[100];//在堆區(qū)開(kāi)辟了一塊100個(gè)字節(jié)的空間,首地址賦給str 注意new int(100) 和new char[100]的區(qū)別(坑)。 new申請(qǐng)的空間自動(dòng)賦值為0 刪除單個(gè)變量空間delete num;,刪除數(shù)組空間delete []str; 9.引用 操作符 &,代替指針,給變量取個(gè)別名,引用不占空間 int num = 10; int &a = num;//定義一個(gè)num的別名a 引用必須賦初值,定義后不能修改。 可作為參數(shù)和返回值,提高程序的執(zhí)行效率。 10.C++有封裝性,增加了對(duì)成員的訪問(wèn)權(quán)限 private只能在類(lèi)中訪問(wèn),public類(lèi)中類(lèi)外都能訪問(wèn),class類(lèi)的成員默認(rèn)為private 還是那個(gè)類(lèi) class Stu { private://這一行開(kāi)始之后的所有成員都是私有成員 int id; char *name; public://這一行開(kāi)始之后的所有成員都是公有成員 void study() { cout< } }; 規(guī)范1:C++中一般將屬性設(shè)置為private, 操作設(shè)置為public,然后每一個(gè)屬性都有相應(yīng)的操作,如setId(),getId(), setName(), getName()好像面向?qū)ο缶幊潭际沁@個(gè)套路 規(guī)范2:成員函數(shù)一般放在類(lèi)外定義,類(lèi)內(nèi)聲明,定義時(shí)加 類(lèi)名:: 指定 如void Stu::setId(int num) 11.構(gòu)造函數(shù) 特殊的成員函數(shù),用于在定義對(duì)象時(shí)進(jìn)行初始化 構(gòu)造函數(shù)名稱(chēng)和類(lèi)相同,可以有參也可以無(wú)參,沒(méi)有返回值(包括void),由編譯器自動(dòng)調(diào)用。 如果沒(méi)有自定義構(gòu)造函數(shù)則使用默認(rèn)的構(gòu)造函數(shù)(空函數(shù)),構(gòu)造函數(shù)可重載,可缺省。 使用new定義對(duì)象時(shí)也會(huì)調(diào)用構(gòu)造函數(shù)Stu *s2 = new Stu(); 12.析構(gòu)函數(shù) 構(gòu)造函數(shù)的反操作,在刪除對(duì)象或?qū)ο笸顺錾芷跁r(shí)完成反初始化操作,如清理內(nèi)存 在構(gòu)造函數(shù)前加~號(hào),一般情況下析構(gòu)函數(shù)由編譯器執(zhí)行,使用delete時(shí)會(huì)觸發(fā)調(diào)用 一般情況下不需要定義析構(gòu)函數(shù)(沒(méi)有為類(lèi)中的成員開(kāi)辟堆區(qū)內(nèi)存) 如在構(gòu)造函數(shù)中有 Stu() { name = new char[100]; } 則必須用析構(gòu)函數(shù) ~Stu() { if(NULL != name) { delete []name; name = NULL; } } 每個(gè)類(lèi)只有一個(gè)析構(gòu)函數(shù),不能重載也不能有參數(shù) 13.拷貝構(gòu)造函數(shù) 特殊的構(gòu)造函數(shù),定義對(duì)象時(shí)使用已存在對(duì)象完成初始化 名稱(chēng)與類(lèi)相同,無(wú)返回值,參數(shù)必須是當(dāng)前類(lèi)的對(duì)象的引用 使用條件:寫(xiě)Stu s2 = s1;和Stu s3(s1);時(shí)會(huì)調(diào)用拷貝構(gòu)造函數(shù),而寫(xiě)Stu s2 ; s2 = s1;則不會(huì)調(diào)用拷貝構(gòu)造函數(shù)。 一般情況下不需要自定義拷貝構(gòu)造函數(shù)(和析構(gòu)函數(shù)一樣沒(méi)有為類(lèi)中的成員開(kāi)辟堆區(qū)內(nèi)存),因?yàn)槿绻欢x拷貝函數(shù)編譯器只會(huì)進(jìn)行淺拷貝操作(只拷貝值,不拷貝內(nèi)存空間),釋放時(shí)會(huì)出現(xiàn)段錯(cuò)誤 所以當(dāng)類(lèi)中有指針且為指針?lè)峙淞丝臻g時(shí),要自定義拷貝構(gòu)造函數(shù)進(jìn)行深拷貝。 Stu(const Stu &s1) { id = s1.id; name = new char[strlen(s1.name)+1]; strcpy(name, s1.name); } 類(lèi)中有動(dòng)態(tài)內(nèi)存分配時(shí),需要自定義拷貝構(gòu)造函數(shù),否則會(huì)因?yàn)槎啻吾尫磐欢蝺?nèi)存導(dǎo)致段錯(cuò)誤(double free or corruption) 14.const 修飾的成員函數(shù) void setId(int num)const { } 稱(chēng)為只讀成員函數(shù),只能讀取成員值,不能修改(除非是mutable int id) 15.對(duì)象數(shù)組:有限個(gè)相同類(lèi)型的對(duì)象構(gòu)成的集合 Stu array[3]={Stu(1), Stu(2)}; 16.this指針 一個(gè)隱藏的指針變量,是成員函數(shù)的第一個(gè)參數(shù),類(lèi)型為對(duì)象的類(lèi)型 如果對(duì)象的成員函數(shù)形參和屬性相同,可用this指定 用于規(guī)范: void setId(int id) { this->id = id; } 如果要重復(fù)調(diào)用成員如:s1.setId(10).getId();可使setId()返回對(duì)象的引用(return *this) 17.枚舉(常與switch使用) 構(gòu)造函數(shù)列表 Stu():id(10), score(99.5) { } 使用方法和構(gòu)造函數(shù)相同,但是可以完成特殊成員的初始化如const修飾的成員 18.const修飾的成員 只能用構(gòu)造函數(shù)列表初始化,const修飾的成員在不同的對(duì)象中可以有不同的值 19.靜態(tài)成員 static int num; static int getNum(); 靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù),初始為0 靜態(tài)數(shù)據(jù)成員在類(lèi)外定義,類(lèi)內(nèi)聲明,和類(lèi)的其它成員不在一塊內(nèi)存,不占用對(duì)象的空間,sizeof()不會(huì)計(jì)算。 屬于整個(gè)類(lèi)而不是某個(gè)對(duì)象,可通過(guò)類(lèi)名::對(duì)象訪問(wèn)Stu::num 作用之一:代替全局變量 靜態(tài)成員函數(shù)不能使用非靜態(tài)數(shù)據(jù)成員,只能訪問(wèn)靜態(tài)數(shù)據(jù)成員和全局變量, 不能使用this 為了更好地操作使用靜態(tài)數(shù)據(jù)成員而出現(xiàn)靜態(tài)成員函數(shù),在定義對(duì)象之前即可操作靜態(tài)數(shù)據(jù)成員。 20.對(duì)象成員 即類(lèi)的嵌套,類(lèi)似結(jié)構(gòu)體嵌套,一個(gè)類(lèi)的對(duì)象作為另一個(gè)類(lèi)的成員 給對(duì)象成員中的數(shù)據(jù)成員賦值要用構(gòu)造函數(shù)列表 class A { public: int aNum; A(){ aNum = 1; cout<<"在A構(gòu)造函數(shù)中"< } A(int num){ aNum = num; } }; class B { public: int bNum; A a; B() { bNum = 2; cout<<"在B構(gòu)造函數(shù)中"< } B(int num):a(10) { bNum = num; } }; 21.友元 在類(lèi)外訪問(wèn)類(lèi)的私有成員 友元函數(shù),友元成員,友元類(lèi) 關(guān)鍵字friend 友元函數(shù):將一個(gè)類(lèi)外函數(shù)聲明為friend,可以訪問(wèn)類(lèi)的私有成員,友元函數(shù)定義有順序要求 友元成員:一個(gè)類(lèi)的成員函數(shù)聲明為friend如:friend void Tch::getNum(),另一個(gè)類(lèi)的成員函數(shù)可以訪問(wèn)該類(lèi)成員。 友元類(lèi):friend class Tch; 友元一般不使用,因?yàn)槠茐牧撕瘮?shù)的封裝性 22.運(yùn)算符重載 也叫運(yùn)算符重載函數(shù),為適應(yīng)對(duì)象操作 int operator +(A a1, A a2) { return a1.num+a2.num; } 運(yùn)算符重載實(shí)質(zhì)為函數(shù)重載,必須遵循其原則 除了成員運(yùn)算符".", "sizeof", 條件運(yùn)算符"?:", 作用域運(yùn)算符"::"之外都可以重載,重載后優(yōu)先級(jí)和結(jié)合性不變 一般重載為友元函數(shù)或成員函數(shù) 單目運(yùn)算符重載為成員函數(shù),雙目運(yùn)算符重載為友元函數(shù) "=", "()", "[]", "->"不能重載為友元 另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
分享題目:C++必備基礎(chǔ)知識(shí)和編程規(guī)范-創(chuàng)新互聯(lián)
分享鏈接:http://weahome.cn/article/iepio.html