第一個C++程序
#include<iostream>
using namespace std;
int main()
{cout << "hello world !" << endl;return 0;
}
????????上邊的代碼就是用來打印字符串 “hello world !” 的,可見,與C語言還是有很大的差別的,接下來我們就直接進入C++的世界!?
命名空間namespace
? ? ? ? 在我們日常寫代碼的過程當中,可能會在同一個域中出現變量名,函數名等等的定義重名的情況,如果還是堅持不同變量用相同的名字的話,編譯器就會報錯,這個時候,我們就需要用到namespace關鍵字
????????定義命名空間
? ? ? ? 我們首先來看下邊的一張圖片。
? ? ? ? 上邊是用C語言寫的代碼,其中就定義了兩個重名的x,但是為什么這里代碼沒有報錯,并且打印的是10呢?
? ? ? ? 原因是這里的x一個是屬于全局域,一個是屬于局部域,而在默認的情況下(也就是沒有指定域的情況下),編譯器會默認先局部去找,然后再全局去找,因此這里就打印的是10。
? ? ? ? 那如果兩個x都在全局的位置呢?
? ? ? ? 其實除了全局域,局部域,還有很多其它的域,我們主要探討的是用namespace定義的域,用最簡單的理解方式就是用namespace可以定義一個域,然后在這個自己定義的域里邊寫的東西就不會與全局的發生命名重復的沖突了,因此,namespace解決的是全局的命名重復問題。不能定義在局部。
? ? ? ? 來看一下下邊的例子。
#include<stdio.h>//命名空間的定義就是
//namespace 命名空間名
namespace xc
{int x = 10;
}int x = 100;//全局變量int main()
{printf("%d\n", x);//100printf("%d\n", xc::x);//10return 0;
}
? ? ? ? ::表示的是域作用限定符,如果它的前邊什么都不加的話,就默認訪問的是全局域的,上邊代碼里邊的第一個x打印結果是100,是因為不加任何東西的情況下,編譯器就先局部找,然后再全局找,如果想要訪問命名空間里邊的x,就要像上邊的那種寫法。
? ? ? ? 這里還要額外說明一下,命名空間域不會影響變量的生命周期,因此上邊命名空間域xc里的x還是屬于全局變量的。
? ? ? ? namespace的嵌套定義:
? ? ? ? 首先,不同文件里邊的同名的命名空間域會認為是同一個。
? ? ? ? 但在日常的工作當中,同一個項目可能會有不同的小組去完成,而不同的小組可能會使用不同名字的命名空間域,同一個namespace的內部可能又有重名的,這時候就可以用namespace的嵌套定義。看一個例子。
#include<stdio.h>namespace xxc
{namespace xc1{int rand = 1;int Add(int left, int right){return left + right;}}namespace xc2{int rand = 2;int Add(int left, int right){return (left + right) * 10;}}
}int main()
{printf("%d\n", xxc::xc1::rand);printf("%d\n", xxc::xc2::rand);printf("%d\n", xxc::xc1::Add(1, 2));printf("%d\n", xxc::xc2::Add(1, 2));return 0;
}
????????命名空間使用
? ? ? ? 在上邊已經說了在編譯查找的時候如果不指定在命名空間域里邊查找,是不會去找的,只會默認先局部然后全局的方式去找。
? ? ? ? 但是想要訪問命名空間中的變量或者函數不止只有指定命名空間這樣一種方式。還有兩種方式。
? ? ? ? 其一是可以展開命名空間中的全部成員。
? ? ? ? 其二是可以將命名空間中的某個成員展開。
? ? ? ? 請看下邊的代碼示例。
#include<stdio.h>namespace xxc
{int a = 0;int b = 10;
}//指定命名空間訪問
int main()
{printf("%d\n", xxc::a);return 0;
}//展開命名空間中的某一個成員
using xxc::a;
int main()
{printf("%d\n", a);printf("%d\n",xxc::b);return 0;
}//using 將命名空間全部展開
using namespace xxc;
int main()
{printf("%d\n", a);printf("%d\n", b);
}
C++中的輸入和輸出
? ? ? ? <iostream>是 Input Output Stream的縮寫,它是一個標準的輸入輸出流庫,里邊定義了標準的輸入輸出流對象。
? ? ? ? 這里涉及到更深的就不在本篇博客里邊講解了,大家初學的話就了解基本用法就行。
? ? ? ? cout和cin一個是輸出的意思,一個是輸入的意思,其中cout配對的是流插入運算符?<< 表示輸出,cin配對的是流提取運算符?>>,表示輸入。并且這兩個輸入和輸出都會自動識別類型且可以輸入輸出任意類型。最后一個就是endl,現在初學者暫且理解它的作用為換行就行了。
#include<iostream>
using namespace std;
int main()
{int a;float b;cin >> a >> b;cout << a << " " << b << " " << endl;return 0;
}
缺省參數
? ? ? ? 缺省參數是在函數聲明或者定義的時候的給函數形參的一個默認的值。缺省參數分為全缺省和半缺省。
? ? ? ? 全缺省就是給函數全部的參數給缺省值,半缺省就是從右到左依次給函數參數缺省值且不能跳躍著給缺省值。
? ? ? ? 當在調用有缺省參數的函數的時候,我們給實參是從左往后按照順序依次給到形參的,不能間隔著給值,沒有自己給值的話,函數就會用默認的缺省值。但如果那個函數是半缺省的話,那沒有缺省值的參數一定要給它傳值。
? ? ? ? 最后一個點就是如果有多文件的大項目的時候,缺省值是在函數聲明的時候給的,函數定義的時候就不用給缺省值了(初學者先了解)
? ? ? ? 代碼示例
#include<iostream>
using namespace std;//全缺省
void Func1(int a = 10, int b = 100, int c = 1000)
{cout << a << " " << b << " " << c << " " << endl;
}//半缺省
void Func2(int a, int b = 100, int c = 1000)
{cout << a << " " << b << " " << c << " " << endl;
}int main()
{//調用全缺省的函數Func1();Func1(1, 2, 3);Func1(1, 2);//調用半缺省的函數Func2(1);//沒有缺省值的參數必須給值Func2(1, 2);Func2(1, 2, 3);return 0;
}
函數重載
? ? ? ? 在C++里邊的同一個作用域下支持出現同名的函數,有個要求就是這些函數的形參列表是需要不同的。包括以下幾點。
? ? ? ? 1.函數的形參的個數不同
? ? ? ? 2.函數的形參的類型不同
? ? ? ? 3.函數的形參的類型順序不同
? ? ? ? 請看以下的示例
#include<iostream>
using namespace std;//聲明,以下的函數重載只是舉例子,就不寫函數體了
//1.參數的類型不同
int Add(int a,int b)
{ }double Add(double a,double b)
{ }//2.參數的個數不同
void f()
{ }void f(int a)
{ }//3.參數的類型的順序不同
void f(int a,char b)
{ }void f(char b, int a)
{ }int main()
{return 0;
}
? ? ? ? 當調用有重載的函數的時候,編譯器會根據這些參數的不同來自動判斷我們調用的是哪個函數。