C++起源史
C++由美國AT&T貝爾實驗室的本賈尼·斯特勞斯特盧普博士在20世紀80年代初期發明並實現(最初這種語言被稱作“C with Classes”帶類的C)。開始,C++是作爲C語言的增強版出現的,從給C語言增加類開始,不斷的增加新特性。虛函數(virtual function)、運算符重載(Operator Overloading)、多重繼承(Multiple Inheritance)、模板(**Template)常(Exception)、RTTI、命名空間(Name Space)逐漸被加入標準
C++和C語言的關係:
C是C++的子集,C++兼容C的特性。
C++是C語言的繼承,進一步擴充和完善了C語言,成爲一種面向對象的程序設計語言。C++這個詞在中國大陸的程序員圈子中通常被讀做“C加加”,而西方的程序員通常讀做“C plus plus”,“CPP”。
和C的區別
1、數據類型
在C語言中數據類型主要分爲基本類型、構造類型、指針類型、空類型。
基本類型:整型 int、字符型 char、實型(單精度 float、雙精度double)
構造類型:數組類型、結構類型 struct、聯合類型 union、枚舉類型 enum
指針類型
空類型:void
而在C++中 ,除了以上類型之外,另外新增了布爾類型 bool,其值爲true或者flase,還引入了類的結構類型。
2、初始化方法
C語言中,變量初始化的方法爲複製初始化,如:
int x = 100; //複製初始化
C++中,另外增加一種初始化方法爲直接初始化,如:
int x(100); //直接初始化
3、變量的定義
在C語言中,變量的定義要在函數的前面,即當函數中使用到一個新的變量時,要將該變量定義在函數的前面;而在C++中,變量可以隨用隨定義,如:
for(int i = 0; i < 10; i++) //隨用隨定義
4、輸入輸出
C語言中,輸入輸出方法如下:
int n;
scanf("%d",&n); //利用scanf輸入
printf("%d\n, n"); //利用printf輸出
C++中,輸入輸出方法如下:
int n;
cin>>n; //利用cin輸入
cout<<n<<endl; //利用cout輸出
可以看到,C++中的輸入輸出不再關心待輸入輸出的數據類型,更加簡單方便。
需要注意的是,在C++中若有輸入輸出,需添加頭文件:
#include<iostream>
另外,需要說明,cin和cout是命名空間std下的函數,即:
using namespace std;
5、命名空間
C++中添加了命名空間這個概念,通俗來講,命名空間就是爲變量和函數創建一個自己的空間,當不同的程序員開發的源代碼中使用相同名稱的變量和函數時,主函數能夠正確地調用自己需要的函數。
#include <iostream> //IO流
#include <stdio.h> //標準輸出
using namespace std; //命名空間,隔離名字,防止命名衝突,
//c++所有空間默認std命名空間
namespace my //自定義域my
{
int a=12;
namespace one //自定義my域裏面嵌套one域
{
int c=200;
}
}
namespace you //自定義you域
{
int a=1;
}
using namespace you; //將自定義域名變成全局變量
int a=100;//定義全局變量
int main()
{
int a=10; //定義局部變量
printf("局部變量a=%d\n",a);
printf("全局變量a=%d\n",::a);
printf("my域a=%d\n",my::a);
printf("you域a=%d\n",you::a);
printf("my域嵌套c=%d\n",my::one::c);
return 0;
}
運行結果如下
[zyc@localhost lesion1]$ ./a.out
局部變量a=10
全局變量a=100
my域a=12
you域a=1
my域嵌套c=200
總結:
1:當自定義域變成全局變量時且本來已經定義全局變量,訪問全局變量時,優先級:
全局變量高於自定義全局變量
2:如果沒有指定命名空間,需要在輸出時指定變量域
如
#include<iostream>
#include <stdio.h>
//using namespace std;//直接展開
int max=100;
int main()
{
printf("%d\n",max);
printf("%d\n",std::max(1,2));//直接指定輸出域
return 0;
}
6:C++自動識別類型(但會發生截斷)
#include<iostream>
#include <stdio.h>
using namespace std;
int main()
{
double d=1.11111111;
cout<<"c++環境d="<<d<<endl;
printf("C環境下d=%lf\n",d);
return 0;
}
運行結果
c++環境d=1.11111
C環境下d=1.111111
總結:在C語言中,默認截斷位數爲6位,在C++中,默認截斷5位。並且輸出不需要指定類型。
7:C++函數重載(C++特有)
1)函數重載定義:
在同一個作用域中,如果有多個函數的名字相同,但是形參列表不同(參數類型不同或參數個數不同),返回值類型可同也可不同,我們稱之爲重載函數。
重載的函數是通過形參列表區分的,與返回值類型無關。函數重載其實是”一個名字,多種用法”的思想,不僅函數可以重載,運算符也可以重載。
2)函數重載過程
詳細過程見下面這篇博客
https://blog.csdn.net/gogogo_sky/article/details/72807123#0-qzone-1-40789-d020d2d2a4e8d1a374a433f596ad1440
8:缺省參數(備胎)
定義:在函數定義或創建時,給形參一個默認的參數,這樣即使在調用函數時即使沒有給函數實參,函數就默認剛纔設置的形參。
規則:
1)缺省只能 從右往左缺省。
2)缺省值必須爲常量或全局變量 (const/static/普通的 全局變量 也可以作爲缺省參數)
3)缺省參數只能出現在聲明或者定義的一處
4)不能把 const的全局變量 作爲缺省值
5)缺省值不構成函數重載,缺省值並沒有賦予函數新的功能
如下:
#include<iostream>
using namespace std;
//缺省:全缺省,半缺省(從右往左連續缺省)
int Add(int a=1,int b=2)
{
return a+b;
}
int main()
{
cout<<Add(3,4)<<endl; //有實參,直接使用實參值
cout<<Add(6)<<endl;//半缺省參數,另外一個形參默認b=2
cout<<Add()<<endl;//全缺省參數,默認a=1,b=2
return 0;
}
運行結果:
[zyc@localhost lesion1]$ ./a.out
7
8
3
特別提醒:
(1)凡是出現利用缺省參數值作if判斷,並且判斷後實現代碼完全不同的,都應該分拆成兩個獨立的函數。