歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C++基礎基礎:C與C++的區別

內容:
(1)C++簡介和編程的基本變化
(2)命名空間的概念和使用
(3)結構體、聯合、枚舉的不同
(4)布爾類型 以及 運算符別名
(5)函數的重載、缺省參數、啞元以 及內聯

1.簡介和編程的基本變化
1.1 C語言的簡介
1969年,使用匯編語言編寫操作系統,湯普遜 發明了一門語言 B語言,丹尼斯-裡奇 在B語言的基礎上 New B語言,後來改名為C語言
C語言 出生於 1972年

1.2 C++語言的簡介
 在C語言的基礎上,本賈尼-斯特勞斯特盧普(Bjarne Stroustrup)做了一定的擴展,起名 New C語言,後來改名為“C with Classes(帶類的C)”,想到了C語言中的運算符 ++, 最後改名為C++,於1983年誕生

1.3 相關的歷史事件
(1)1983年, C++語言誕生
(2)1985年,CFront1.0 第一個C++編譯器誕生
(3)1987年,GNU C++編譯器
(4)1990年,Borland C++
 (5)1992年,Microsoft C++
 (6)1998年,第一個ISO C++標准誕生
(vc6.0 1998年誕生)
 (7)2003年,ISO對C++標准做了修改,C++03標准
(8)2011年,最新的C++標准,C++11或者C++0x
 (部分編譯器支持)

1.4 C++和C語言的比較
(1)C++和C語言都是編譯型語言,也就是只有編譯之後才能運行的,有些是不需要編譯就可以直接運行的,是通過解釋器執行的,這種語言叫腳本語言
vi xxx.sh date;cal;ls -l;
 (2)C++和C語言都是強類型語言,所有的標示符都必須有數據類型
a; a = 10; //error
 (3)C++對C語言提供兼容,並且做了優化提供了更多的特性
a.語言風格更加簡潔
b.類型檢查更加嚴格
// error
 int* pi = malloc(sizeof(int));
 c.支持面向對象編程
d.支持運算符重載
1+1 = 2
一個人 + 10
 e.支持異常處理
f.支持泛型編程
double float ...

1.5 C++的主要用途
(1)用於游戲開發
(2)用於系統和驅動開發

C++ 沒有C語言更加底層,也沒有JAVA/C#更加偏向應用級
 網站技術:javaWeb/.net/PHP

編寫第一個C++程序

1.6 編程的基本變化
(1)文件的擴展名發生變化
C語言中源文件: xxx.c
 C++中源文件:.C/.cc/.cxx/.cpp(plus plus)

 C語言中頭文件: xxx.h
 C++中頭文件: xxx.hpp / xxx.h

(2)頭文件的變化
C語言中: #include <stdio.h>
 C++中: #include <iostream>

使用C語言中頭文件:
#include <cstdio> 去掉.h,前面加c
 vi /usr/include/c++/4.6/cstdio文件中包含的還是 stdio.h文件

(3)輸入輸出的變化
C語言中:scanf/printf 函數
C++中:cin/cout 對象

(4)編譯器的變化
C語言中:gcc/cc xxx.c
 C++中: g++/c++ xxx.cpp
 gcc/cc xxx.cpp -lstdc++

g++/c++ 的編譯選項和 gcc/cc一樣
-c 只編譯不連接
-S 生成匯編文件
-o 指定輸出文件名
-O 優化
...

(5)命名空間
using namespace std;
使用標准命名空間,標准庫中類以及函數等全部放在std的命名空間中

2.命名空間的學習和使用
 引入了命名空間(namespace)的概念,主要用於區分同名的函數、變量等

2.1 自定義命名空間
namespace 命名空間名字
{
變量、函數等
}

注意:
 和結構體的格式非常相似,但是關鍵字不同,並且沒有分號,用於作用域的限定,並不是一種獨立的數據類型


:n1,n2 > 表示將n1行到n2行之間的代碼向右縮進
:n1,n2 < 表示將n1行到n2行之間的代碼向左縮進

2.2 使用名字空間的方式
(1)使用名字空間指令的方式使用命名空間
如:
using namespace std;

(2)使用作用域限定符
:: - 作用域限定符,相當於"的"
如:
std::cout << "大家好才是真的 好";

(3)使用名字空間聲明的方式去使用名字空間中的部分內容
如:
using std::cout;
 using std::endl;
 cout << "大家好才是真的好" << endl;

2.3 無名名字空間
 如果一個標示符沒有被置於任何名字空間中,則默認為無名/匿名名字空間中,可以使用如下形式去訪問標示符:

::無名名字空間成員名

2.4 擴展
(1)同一個命名空間中的內容可以分開寫
(2)命名空間中的函數聲明和定義也可以分開,也就是函數的定義可以放在命名空間的外面
(3)命名空間可以進行嵌套

3.結構體、聯合、枚舉的不同
3.1 結構體中的不同
C語言中:
struct Student/*結構體類型名 */{ ... };
struct Student/*左邊整體作為一 個完整的數據類型*/ s;

 typedef struct Student
 { ....}Student/*別名*/;

typedef struct
 {....}Student/*別名*/;

C++中:
struct Student{...};
 [struct] Student s;

(1)C++中的結構體定義變量時可以省略struct關鍵字
(2)C++中的結構體內部可以定義函數,並且函數內使用成員變量時不需要. ->之類的

注意:
(1)在C語言中如果一個函數的形參表為空時,表示可以接受任意多個任意類型的實參
(2)在C++中如果一個函數的形參表中為空時,表示不接受任何實參

思考:
 為什麼s和s2調用的是同一個show函數而打印出來的數據內容卻不一樣??
(以後講到)

3.2 聯合的不同之處
(1)定義聯合變量的時候可以省略union關鍵字
(2)支持匿名聯合

如:
union un/*un是聯合類型名*/{..};
 [union] un u;

union{...}; 匿名聯合

3.3 枚舉的不同之處
(1)枚舉類型在定義變量時也可以省略enum關鍵字
(2)C語言的枚舉 本質上就是整型,可以使用整數進行賦值
C++中的枚舉 是一種獨立的數據類型,不能使用整數進行賦值
(int類型的值域 比 枚舉類型的大)

4.布爾類型以及運算符的別名
4.1 布爾類型
C語言中:
bool #include<stdbool.h>
 int

C++中:
bool類型是C++中的基本數據類型,bool類型的值有兩個:true 和 false,其本質上就是 1 和 0
 bool類型本質上就是一個單字節整數,任何基本數據類型都可以被隱式地轉換為bool類型

小結:
bool類型定義變量,可以作為函數的參數和返回值類型,當然也可以定義指針類型

4.2 運算符別名
&& & | ||
 ^ 異或運算符 不同為真,相同為假
作業:
 查詢手冊string類型中的各種函數,嘗試著去使用string類型中的各種函數
如:
string s;
 s.c_str();

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2015-10/124072p2.htm

Copyright © Linux教程網 All Rights Reserved