引用必須被初始化,一旦初始化完成引用將和它的初始值對象一直綁定在一起,無法令引用重新綁定到另外一個對象。
引用並非對象,只是對存在的的對象所起的另外一個名字
引用本身不是一個對象,所以不能定義指向引用的指針(指針指向的必須是對象)
指針是對象,所以存在對指針的引用
const指針必須初始化,也就是常量指針必須初始化
引用只能綁定在對象上,而不能與字面值綁定在一起
試圖拷貝或以其它方式訪問無效指針的值都將引發錯誤,編譯器並不負責檢查此類錯誤,這一點和試圖使用未經初始化的變量是一樣的。訪問無效指針的後果無法預計!!!,因此程序員必須清楚任意給定的指針是否有效!!!!
數組的元素應爲對象,因此不存在引用的數組
又因爲數組本身就是對象,所以允許定義數組的指針及數組的引用
int i = 42;
int &ip = i;
int *p;
int *&r = p;
r = &i;
cout << *r << endl;
cout << *p << endl;
cout << ip << endl;
輸出都是42,仔細理解string對象會自動忽略開頭的空白
getline函數會保留輸入字符串中的空白符,它的結束標誌是換行符(換行符也被讀入了),getline(cin, s),然後把讀入的string對象s存取,但是不存換行符
比較以下兩個程序
//按個數輸出單詞,每個單詞輸出後就換行,讀取位置數量的string對象
int main()
{
string word;
while(cin >> word)
{
cout << word << endl;
}
return 0;
}
//按行輸出,使用getline讀取一整行
int main(void)
{
string word;
while(getline(cin, word)) //每次讀取一整行,直到到達文件尾或換行符才結束
{
cout << word << endl;
}
return 0;
}
默認初始化的一些注意的問題
默認初始化的默認值到底是什麼由變量類型決定。同時定義變量的位置也會對此有影響!
如果是內置類型的變量未被顯示初始化,它的值由定義的位置決定,定義於任何函數體之外的變量被初始化爲0.
如果定義在函數體內部的內置類型沒有初始化,它的值是未定義的,不能拷貝或訪問此類值
//訪問數組的不同辦法
#include <iostream>
#include <string>
#include <vector>
#include <cctype>
using namespace std;
int main()
{
int iB[10];
int iA[10];
vector<int> iVec;
for (int i = 0; i < 10; ++i)
{
iA[i] = i;
cout << iA[i] << ' ';
}
cout << endl;
for (int j = 0; j < 10; ++j)
{
iB[j] =iA[j];
cout << iB[j] << ' ';
}
cout << endl;
for (int j = 0; j < 10; ++j)
{
iVec.push_back(iA[j]);
}
for (vector<int>::size_type i = 0; i != iVec.size(); ++i)
{
cout << iVec[i] << ' ';
}
cout << endl;
//不需要改變迭代器指向的內容,所以聲明成常量迭代器
for (vector<int>::const_iterator iter = iVec.cbegin(); iter != iVec.cend(); ++iter)
{
cout << *iter << ' ';
}
cout << endl;
return 0;
}
使用數組的時候編譯器一般會把它轉換成指針。
取地址符可以用於任何對象
數組還有一個特性:在很多用到數組名字的地方,編譯器都會自動地將其替換爲一個指向數組首元素的指針
string nums[] = {"one", "two", "three"};
string *sp = nums; //等於 *sp = &nums[0]