?一、C++語言概述
1 歷史背景
1)C++的江湖地位java、C、C++、python、C#
2)C++之父:Bjarne Stroustrup(1950--)
? ? ?1979,Cpre,為C語言增加類的機制
? ? ?1983,發(fā)布全新編程語言 C with class,后來命名為C++
? ? ?1985,CFont1.0 《The C++ Programming Language》
3)C++發(fā)展過程
1987,GNU C++
1990,Borland C++(BC編譯器)
1992,Microsoft C++(VC編譯器)IBM C++ ...
1998,ISO C++98
2003,對C++98進行修訂,C++03
2011,ISO C++11/C++0x
2014,ISO C++14
2017,ISO C++17*
2020 C++20
2 應(yīng)用領(lǐng)域
1.游戲開發(fā)?
2.科學(xué)計算?
3.網(wǎng)絡(luò)通信(ACE)
4.操作系統(tǒng)和設(shè)備驅(qū)動
5)其它...
3 C和C++
1)都是編譯型語言
2)都是強類型語言,但是C++更強
3)C++很大程度上兼容C,但是去掉了C中一些不好的特性
4)C++增加許多C中不具備的好的特性,比C程序更適合大型軟件的開發(fā)
二 第一個C++程序
1 編譯方式
1)gcc xx.cpp -lstdc++
2)g++ xx.cpp //推薦
2 文件擴展名
1).cpp //推薦
2).cxx
3).cc
4).C
3 頭文件
//包含標準C++中所有和I/O相關(guān)的類型、對象和函數(shù)
#include<iostream>
注:在C++中標準C的頭文件依然可以使用
#include<stdio.h>==> #<cstdio>
#include<stdio.h>==> #include<cstdlib>
#include<stdio.h>==> #include<cstring>
...
4 標準輸入和輸出
1)cin對象表示標準輸入//類似scanf
eg:
int num;
scanf("%d",&num);//c中
cin >> num;//c++中
其中“>>”稱為提取操作符
----------------------------
int i;
double d;
scanf("%d%lf",&i,&d);//C
cin >> a >> d;//C++
2)cout對象表示標準輸出//類似printf
eg:
int num = 1234;
printf("num=%d\n",num);//C
cout << "num=" << num << endl;//C++
其中"<<"稱為插入操作符
注:endl==>“\n”
----------------------------------
int i = 100;
double d = 3.14;
printf("%d,%lf\n",i,d);
cout << i << ',' << d << endl;
5 "std::"標準名字空間
? C++標準庫中的所有函數(shù)、變量、類型都是在std空間中
三 名字空間(namespace)
1 名字空間作用
1)避免名字沖突
2)劃分邏輯單元
2 定義名字空間
namespace 名字空間{
名字空間成員1;
名字空間成員2;
...
名字空間成員n;
}
注:名字空間成員可以是全局變量、函數(shù)、類型、名字空間
eg:
namespace ns1{
int num = 100;
void func(...){...}
struct Student{...};
namespace ns2{...};
}
3 名字空間成員的使用
1)通過作用域限定操作符 "::"
空間名::要訪問的成員;
eg:
int main(void){
//空間里面成員不能直接訪問
//cout << num << endl;//error
//通過“::”訪問空間里面的成員
cout << ns1::num << endl;//ok
}
2)名字空間指令
using namespace 名字空間名;
在該條指令以后的代碼中,指定名字空間中的成員都可見,可以直接訪問,省略"空間名::".
常用場景:using namespace std;
以后在使用標準名字空間里面的成員可以省略"std::"
eg:
int main(void){
using namespace ns1;//名字空間指令
cout << num << endl;//ok
}
3)名字空間聲明
using 名字空間名::名字空間成員;
將名字空間中特定的一個成員引入當前作用域,在該作用域訪問這個成員就如同訪問局部的成員一樣,可以直接訪問,省略“空間名::”。
eg:
int main(void){
using ns1::num;//名字空間聲明
cout << num << endl;//ok
}
4 無名名字空間
? 不屬于任何名字空間的標識符,將被編譯器自動的放入無名名字空間中,無名空間里面的成員正??梢灾苯釉L問,但是當無名空間的成員和局部的標識符名字一樣時,局部優(yōu)先,這時如果還希望訪問無名空間的成員,可以使用作用域限制操作符:"::要訪問的成員"。
5 名字空間嵌套//了解
eg:
namespace ns1{
int num = 100;
namespace ns2{
int num = 200;
namespace ns3{
int num = 300;
}
}
}
cout << ns1::num << endl;//100
cout << ns1::ns2::num << endl;//200
cout << ns1::ns2::ns3::num << endl;//300
四 C++的結(jié)構(gòu)體、聯(lián)合體、枚舉
1 C++結(jié)構(gòu)體
1)定義結(jié)構(gòu)體變量可以省略struct關(guān)鍵字
2)在C++結(jié)構(gòu)體中可以直接定義函數(shù),稱為成員函數(shù)(方法),在成員函數(shù)中可以直接訪問其它成員.
eg:
struct Student{...};
struct Stduent s;
typedef struct Stduent STU;
STU s2;
-------------------
struct Student{...};
Student s;
2 聯(lián)合體//了解
1)定義聯(lián)合體變量可以省略union關(guān)鍵字
2)支持匿名聯(lián)合
3 枚舉
1)定義枚舉變量時enum關(guān)鍵字可以省略
2)C++中枚舉類型不能當做整型數(shù)直接來用
eg:
0 --> RUN
1 --> SLEEP
2 --> STOP
enum STATE{RUN,SLEEP,STOP};
/*enum*/ STATE s;
s = 1;//C:ok? C++:error
s = SLEEP;//C:ok C++:ok
五 字符串
1 回顧C中的字符串
1)雙引號常量字符串: "hello"
2)字符指針:char*
3)字符數(shù)組:char[]
2 C++中兼容C的字符串的同時,增加了string類型專門表示字符串。
1)定義字符串
? string s;//定義一個空字符串
? string s = "hello";//定義字符串同時初始化
? //下面兩種寫法和上面寫法等價
? string s = string("hello");
? string s("hello");
2)字符串拷貝: =
string s1 = "hello";
string s2 = "jiangguiliang";
s1 = s2;//拷貝
cout << s1 << endl;//"jiangguiliang"
3)字符串連接:+ +=
string s1 = "hello";
string s2 = " world";
string s3 = s1 + s2;
cout << s3 << endl;//hello world
s1 += s2;//s1 = s1 + s2;
cout << s1 << endl;//hello world
4)字符串比較:== != > < >= <=
string s1 = "hello";
if(s1 == "hello"){//1:邏輯真
...
}
if(s1 > "Jiangguiliang"){//1:邏輯真
...
}
5)獲取字符串中某個字符: []
string s1 = "hello";
cout << s1[0] << endl;//'h'
s1[0] = 'H';
cout << s1 << endl;//Hello
6)string類型中常用的成員函數(shù)
size()/length() :獲取字符串的長度
c_str() :將string轉(zhuǎn)換為C中const char*字符串
string s = "hello";
s.size();//5
s.length();//5
const char* p = s.c_str();