===================================================================
推薦書籍:
《C++程序設計與實現》Bjarne Stroustrup 本賈尼·斯特勞斯特盧普
《C++ Primer》 可讀性不太好
C語言思想:把一個大的問題拆解成很多小的問題,然後逐一解決;
C++語言思想:先對問題整體有一個描述,再解決細節;
===================================================================
一、C++語言概述
1、歷史背景
1)C++江湖地位
java、C、C++、Python、C#
2)C++之父 Bjarne Stroustup(1950~)
1979,Cpre,爲C語言增加類的機制;
1983,發佈全新語言C with class,後來命名爲C++;
1985,CFront1.0(C++編譯器),《The C++ programming Language》;
3)C++發展過程
1987,GNU支持C++
1990,Borland C++(BC)
1992,Microsoft C++(VC)
1998,ISO C++98
2011,ISO C++11/C++0x(在0幾年草案已經公佈)
2、應用領域
1)遊戲開發
2)科學計算
3)網絡通信(ACE - 網絡庫)
4)操作系統和設備驅動
5)其它(嵌入式、編譯器、腳本引擎…)
3、C和C++比較
1)都是編譯型語言
2)都是強類型語言,但是C++更強(強:int a = 100; 弱:a = 100;)
C++類型檢查更加嚴格
3)C++去除了C中不好特性(test.c)
4)C++中增加很多號的特性(面向對象語法),比C語言更適合大型軟件開發;
二、第一個C++程序
1、編譯方式
1)$ gcc xx.cpp -lstdc++
2)$ g++ xx.cpp
g++自動鏈接標準C++庫
2、文件擴展名
1)xx.cpp //推薦使用
2)xx.cc
3)xx.C
4)xx.cxx
3、頭文件
#include <iostream>
#include <stdio.h>
==> #include <cstdio>
(僅適用與標準C庫)
頭文件位置:/usr/include/c++/
4、標準輸入和輸出
1)cin對象表示標準輸入 //類似scanf
eg:
int a;
scanf("%d", &a);
cin >> a; //從標準輸入設備提取一個整形數放到變量a中;">>":提取運算符
eg:
int a;
double d;
//scanf("%d%lf", &a, &d);
cin >> a >> d;
2)cout對象表示標準輸出 //類似printf
eg:
int a = 100;
//printf("%d\n", a); //把數據a插入到標準輸出設備;
cout << a << endl; //"<<":插入運算符
eg:
int a = 100;
int d = 3.14;
//printf("%d %lf\n", a, d); //100 3.14
cout << a << " " << d << endl; //100 3.14
三、名字空間(namespace)
1、名字空間的作用
1)避免名字衝突
2)劃分邏輯單元
2、定義名字空間
namespace 名字空間名{
名字空間成員1;
名字空間成員2;
...
}
eg:
namespace ns1{
int x; //全局變量
void func(){} //全局函數
struct A{}; //自定義類型
namespace ns2; //名字空間
}
3、名字空間的使用
1)通過作用域限定符 “::”
名字空間名::訪問的成員
eg:
int main(void)
{
//訪問ns1名字空間中x變量
x = 100; //error,名字空間裏面成員不能直接訪問
ns1::x = 100; //ok
func(); //error
ns1::func(); //ok
}
eg:
/* std是標準C++庫中已經定義好的名字空間,稱爲標準名字空間,所有C++庫中全局函數、全局變量都在該名字空間中。 */
std::cout << "hello world" << std::endl;
2)名字空間指令
using namespace 名字空間名;
在該條指令以後的代碼中,指定名字空間中的成員都可見,訪問其中成員可以省略作用域限定。(相當於全局變量)
eg:
using namespace std;
int main(void){
cout << "hello world!" << endl;
return 0;
}
3)名字空間聲明
using 名字空間名::名字空間成員;
將名字空間中的特定成員引入當前作用域,在該作用域中訪問這個成員可以省略作用域限定。(相當於局部變量)
eg:
namespace ns{
int i1;
int i2;
}
int main(){
using ns::i1;
i1 = 100; //ok
i2 = 200; //error
ns::i2 = 200; //ok
}
4、無名名字空間
不屬於任何名字空間的全局變量或函數,將被編譯器自動放入無名名字空間中。
eg:::無名名字空間成員;
5、名字空間的嵌套(瞭解)
namespace china{
namespace beijing{
char* name;
}
namespace chengdu{
char* name;
}
}
cout << china::beijing::name << endl;
cout << china::chengdu::name << endl;
四、C++的結構體、聯合體和枚舉
1、結構體
1)定義結構體變量時,可以省略struct關鍵字;
2)結構體中裏面可以定義函數,稱爲成員函數,在成員函數中可以訪問成員變量;
2、聯合體(瞭解) - - - - 節省內存空間
1)定義聯合體變量時可以省略union關鍵字;
2)支持匿名聯合;(只能在局部區使用,不能放在全局區)[本機測試編譯不通過]
07union.cpp:13:7: error: conversion from ‘int’ to non-scalar type ‘main()::<anonymous union>’ requested
un = 0x12345678;
^~~~~~~~~~
07union.cpp:16:18: error: ‘uc’ was not declared in this scope printf("%#x ", uc[i]);
3、枚舉
1)定義枚舉變量時,可以enum關鍵字;
2)C++枚舉看做一種獨立數據類型,而C中枚舉本質就是整形數。
eg:
enum COLOR{RED, GREEN, BLUE};
COLOR c;
c = 100; //c中ok,c++中error
c = RED; //ok
五、字符串
1、回顧C中字符串
1)雙引號常量字符串"hello world"
2)字符串指針:char*
3)字符數組:char arr[..];
eg:
char arr[] = "hello";
strcpy(arr, "xuyeqiang"); //內存越界,危險
char* p = "world"; //const char* p;(p指向的內容不能改變) char* const p;(p的指向不能改變)
strcpy(p, arr); //段錯誤
p = "xuyeqiang"; //ok
arr = "xuyeqiang"; //error
2、C++兼容C中字符串,同時增加string類型,專門表示字符串
1)定義字符串
#include <string>
string s; //定義一個空字符串
string s = "hello";
string s = string("hello"); //和上面等價
string s("hello"); //和上面等價
cout << s << endl; //cout可以直接輸出string類型的字符串
2)字符串的基本操作
運算符 | 基本操作 | 演示 |
+ 或 += | 字符串的連接 | eg1 |
= | 字符串的拷貝 | eg2 |
< 或 <= 或 > 或 >= | 字符串大小的比較 | eg3 |
== 或 != | 字符串是否相同 | |
[] | 獲取字符串中指定的字符 | eg4 |
eg1:
string s1 = "hello";
string s2 = "world";
s1 += s2; // s1 = s1 + s2
cout << s1 << endl; // "helloworld"
eg2:
string s1 = "hello";
string s2 = "world";
s1 = s2;
cout << s1 << endl; // "world"
eg3:
string s1 = "hello";
string s2 = "world";
if(s1>s2){
cout << "s1 > s2" << endl;
}
else{
cout << "s1 < s2" << endl; //ok
}
eg4:
string s = "hello";
s[0] = 'H';
3)string類型中常用的成員函數
size() / length() //獲取字符串的長度
c_str(); //將string轉換爲char*風格的字符串
cin >> s; //讀字符串,碰到空格、tab、回車則結束
getline(cin, s); //可以讀走空格、tab,僅回車時結束