学习C++的第四天
1、頭文件中的 #ifndef/#define/#endif 防止該頭文件被重復引用”
//文件路徑名:el_1\hello.h
#ifndef _HELLO /如果沒有定義 _HELLO文件
#define _HELLO /那么定義 _HELLO文件
void Hello(void); 全局函數聲明
#endif
?
2、頭文件一般用于存放函數原型
3、類本質上是C語言中結構體的擴充,類中不但可以包含數據成員,還可以包含函數成員,并規定了對類中成員的三級訪問權限
在public中聲明的成員可以在程序中自己進行訪問
在private和protected中聲明的成員可以被 此類的成員函數 及 聲明為友元的函數所訪問
在protected中聲明的成員可以被此類派生的類所訪問,而在private中聲明的成員則不能被此類派生的類所訪問
?
4、
/rectangle.h類的聲明放在頭文件中
class Rectangle ?/定義一個Rectangle 類
{
private:
int length , width , height; ? 長方體的長寬高
public:
Rectangle(int len,int wd,int ht); 構造函數。。。。。。。構造函數名與類名相同
virtual~Rectangle(void){} ? ? /析構函數。。。。。。。。析構函數主要用于含有指針的數據成員中釋放動態數據成員
int Volume(void); ?///返回長方體體積的函數-----------------------------改動為int Volume(Rectangle oRectangle)
};
?
///rectangle.cpp類的實現放在源文件中
# include"rectangle.h" ? ?//切記要用雙引號
Rectangle::Rectangle(int len, int wd, int ht)
{
length = len;
width = wd;
height = ht;
}
int Rectangle::Volume(void) ? -------------------------改為int Rectangle::Volume(Rectangle oRectangle)
{
return length*width*height;----------------------------改為 return?oRectangle.length*oRectangle.width*oRectangle.height;
}
?
///main.cpp///主函數
# include<stdlib.h>
# include<iostream>
# include"rectangle.h" 提供類Rectangle的聲明
using namespace std;
int main(void)
{
Rectangle a(6,8,9); ? ? ?利用構造函數 構造一個長方體a ? 此時傳入len=6 wd=8 ht=9 然后再傳給length ?width height
int v = a.Volume(); ?因為屬于Rectangle類 所以需要a. ? ? 利用length width height 計算體積 -------------改為a.Volume(a);
cout<<v<<endl;
system("pause");
return 0;
}
改完后等式仍會成立
?
5、關于 友元
??/rectangle.h類的聲明放在頭文件中
class Rectangle
{
private:
int length , width , height;
public:
Rectangle(int len,int wd,int ht);
virtual~Rectangle(void){}
friend int Volume(Rectangle oRectangle);///加了個friend 意味著該函數并不屬于Rectangle類?
};
?
///rectangle.cpp類的實現放在源文件中
# include"rectangle.h"
Rectangle::Rectangle(int len, int wd, int ht)
{
length = len;
width = wd;
height = ht;
}
int Volume(Rectangle oRectangle) ///友元函數 已經在Rectangle類中聲明過------區別在于該函數不屬于Rectangle類
{
return oRectangle.length*oRectangle.width*oRectangle.height;
}
?
///main.cpp///主函數
# include<stdlib.h>
# include<iostream>
# include"rectangle.h"
using namespace std;
int main(void)
{
Rectangle a(6,8,9);
int v = Volume(a);因為不屬于Rectangle類,所以不需要a.
cout<<v<<endl;
system("pause");
return 0;
}
?
具體大概有下面兩種情況需要使用友元函數:(1)運算符重載的某些場合需要使用友元。(2)兩個類要共享數據的時候。
? ??
1.2.1優點:能夠提高效率,表達簡單、清晰。
1.2.2缺點:友元函數破環了封裝機制,盡量不使用成員函數,除非不得已的情況下才使用友元函數。
?
6、c++的一大特性就是重載(overload),通過重載可以把功能相似的幾個函數合為一個,使得程序更加簡潔、高效。在c++中不止函數可以重載,運算符也可以重載。由于一般數據類型間的運算符沒有重載的必要,所以運算符重載主要是面向對象之間的。
?
?
7、C++的參數傳遞(傳給函數)
? ? <1>傳值方式:是默認方式,在調用函數時,將實參的值傳遞給函數局部存儲相應參數的副本,函數對副本操作,只改變副本的值,而不會修改實參的值
? ? <2>引用方式:引用方式需要在形參聲明時參數名前加上符號&,在調用函數時,被傳遞的不是實參的值,而是實參的地址,函數通過地址存取實參。C語言通過指針實現。
? ? 將數組作為值參傳遞時,由于數組名實際表示數組的起始存儲地址,傳遞的是數據第一個元素的地址,這樣對數組元素的修改本質是對實參數組元素的修改
?
?
void swap(int &a,int &b)------------用引用&傳遞方式b實現
{
int t;
t = a;
a = b;
b = t;
}--------------------------------------對應swap(u,v)---------------int a=1 ;int &ra = a; 則ra=1;-------ra = ra-1;cout<<a;輸出0 ? 引用的值改變能改變實參的值
?
?
void swap(int *a,int *b)------------用指針傳遞方式實現
{
int t;
t = *a;
*a = *b;
*b = t;
}--------------------------------------對應swap(&u,&v)
?
8、DEVC++出現打開文件失敗的情況 ?有可能是32位機子然后卻選擇了64位的解決方法(右上角)
?
9、exit()
雖然現在大多數平臺下,直接在 main() 函數里面 return 可以退出程序。但是在某些平臺下,在 main() 函數里面 return 會導致程序永遠不退出(因為代碼已經執行完畢,程序卻還沒有收到要退出的指令)。換句話說,為了兼容性考慮,在特定的平臺下,程序最后一行必須使用 exit() 才能正常退出,這是 exit() 存在的重要價值。0表示程序已經正常執行完畢,而非0值則表示有錯誤發生,至于非0值具體為多少則由開發者自己定義,比如1代表輸入錯誤,2代表計算錯誤之類的 10、有關C++的動態存儲分配 通常定義變量(或對象),編譯器在編譯時都可以根據該變量(或對象)的類型知道所需內存空間的大小,從而系統在適當的時候為他們分配確定的存儲空間。這種內存分配稱為靜態存儲分配; 有些操作對象只在程序運行時才能確定,這樣編譯時就無法為他們預定存儲空間,只能在程序運行時,系統根據運行時的要求進行內存分配,這種方法稱為動態存儲分配。所有動態存儲分配都在堆區中進行。 當程序運行到需要一個動態分配的變量或對象時,必須向系統申請取得堆中的一塊所需大小的存貯空間,用于存貯該變量或對象。當不再使用該變量或對象時,也就是它的生命結束時,要顯式釋放它所占用的存貯空間,這樣系統就能對該堆空間進行再次分配,做到重復使用有限的資源。 c++中使用new分配的存儲單元必須用delete進行釋放 new命令的使用格式: new 被建立對象的數據類型 或 new 被建立對象的數據類型[分配存儲單元個數]------數組 new命令返回指向被建立對象的指針 delete命令的使用格式: delete 指向被釋放對象的指針 或 ? delete []指向被釋放對象數組的指針 11、在C++中類與結構的區別在于:在結構中默認的訪問權限是public ?而在類中默認的訪問權限是private。除此之外,類與結構是等價的 12、算法應具有以下幾種性質:正確性、具體性、有限性、確定性、可讀性、健壯性(能對非法數據處理 不應死機或出現異常結果) 13、間接運算符 *和某元素的地址 連在一起以表示 該元素 14、對于數組a[10]來說 ?a+i 等價于 &a[i] ? 所以 ? *(a + i) 等價于 a[i] ? ? ?特殊的 a等價于 &a[0]
# include<iostream>
using namespace std;
int main()
{
int a[10];
*(a+1)= 5;
cout<<a[1];
return 0;
}
?
15、 &a[9] - 3 = a +9 - 3 = a +6 = &a[6] ? ? ? ?&a[9] - &a[6] = a+9-a-6=3 ?除此之外,其他任何對地址的運算操作都是不允許的
?
轉載于:https://www.cnblogs.com/wshyj/p/6262516.html
總結
- 上一篇: 有意义的微信网名
- 下一篇: angularjs post 跨域